Массив из PHP в Oracle
#32262983
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
На тебе кросспост из ораклевого форума. Правда, я не чистый oci использую, а через ADODB.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140.
global $conn;
/*
Мы будем собирать вот такой SQL
declare
a pkg_chars.cvarray;
a1 pkg_chars.charvalue;
a2 pkg_chars.charvalue;
begin
a1.charid:=0; a1.chartype := 1; a1.ivalue := :sa1;
..
aN.charid:=0; aN.chartype := 1; aN.ivalue := :saN;
a := pkg_chars.cvarray1(a1, a2, .., aN);
SetCatCharValues(:category_id, a);
end;
/
*/
settype($cat_id, 'integer');
settype($effective_uid, 'integer');
# получаем список типов характеристик
$cho = new CCharacteristics();
$r = $cho -> GetTypesList();
if ($r['code'] == ERR_NONE) {
# собираем массив вида (id типа => название колонки)
$charcolumns = array();
for ($i = 0 ; $i < $r['num']; $i++)
$charcolumns[$r[$i]['ID']] = $r[$i]['column'];
# блок declare
$sqlheader = "declare\n a pkg_chars.cvarray;\n" ;
# тело begin-end до конструирования массива
$sql = "begin\n" ;
# конструирование массива
$sqlvalue = " a := pkg_chars.cvarray(" ;
# массив переменных для биндинга
$bindvalues = array();
# для всех записей значений собираем записи в SQL
foreach ($values as $i => $value) {
$sqlheader .= " a$i pkg_chars.charvalue;\n" ;
$sqlvalue .= "a$i, " ;
settype($value['charid'], 'integer');
$sql .= " a$i.charid := " .$value['charid']. ";\n" ;
$sql .= " a$i.chartype := " .$value['chartype']. ";\n" ;
$types = array();
$bindvalues[ "sa$i" ] = $value['value'];
switch (strtoupper($charcolumns[$value['chartype']])) {
case 'IVALUE':
settype($bindvalues[ "sa$i" ], 'integer');
$sql .= " a$i." .$charcolumns[$value['chartype']]. " := :sa$i;\n" ;
break;
case 'FVALUE':
settype($bindvalues[ "sa$i" ], 'float');
$sql .= " a$i." .$charcolumns[$value['chartype']]. " := :sa$i;\n" ;
break;
case 'DVALUE':
settype($bindvalues[ "sa$i" ], 'string');
if ($value['chartype'] == VAR_TYPE_DATE) {
$sql .= " a$i." .$charcolumns[$value['chartype']]. " := " .DBDate($bindvalues[ "sa$i" ]). ";\n" ;
unset($bindvalues[ "sa$i" ]);
// $bindvalues[ "sa$i" ] = $conn -> DBDate($bindvalues[ "sa$i" ]);
} else {
$sql .= " a$i." .$charcolumns[$value['chartype']]. " := " .$conn -> DBTimeStamp($bindvalues[ "sa$i" ]). ";\n" ;
unset($bindvalues[ "sa$i" ]);
// $bindvalues[ "sa$i" ] = $conn -> DBTimeStamp($bindvalues[ "sa$i" ]);
}
break;
case 'VCVALUE':
settype($bindvalues[ "sa$i" ], 'string');
$sql .= " a$i." .$charcolumns[$value['chartype']]. " := :sa$i;\n" ;
break;
case 'TVALUE':
settype($bindvalues[ "sa$i" ], 'string');
$types[ "sa$i" ] = OCI_B_CLOB;
$sql .= " a$i." .$charcolumns[$value['chartype']]. " := :sa$i;\n" ;
break;
}
}
/*
здесь мы должны иметь
$sqlheader = 'declare a pkg_chars.cvarray;
a1 pkg_chars.charvalue;
...
aN pkg_chars.charvalue;'
$sql = 'begin
a1.charid := 1;
a1.chartype := 1;
a1.ivalue := :sa1;
..
aN.charid := 1;
aN.chartype := 1;
aN.vcvalue := :sa1;'
$sqlvalue = 'a := pkg_chars.cvarray(a1, a2, ..., aN, '
$bindvalues = array(
sa1 => значение,
sa2 => значение
...
saN => значение
)
*/
# отрезаем лишние ', ' у sqlvalue
$sqlvalue = substr($sqlvalue, 0 , - 2 ). ");\n" ;
$sql = $sqlheader.$sql.$sqlvalue. "\n SetCatLinkCharValues(:acat_id, a, :effective_uid);\nend;\n" ;
$bindvalues['acat_id'] = $cat_id;
$bindvalues['effective_uid'] = $effective_uid;
$stmt = $conn -> PrepareSP($sql);
foreach ($bindvalues as $bkey => $bvalue) {
if (!isset($types[$bkey]))
$conn -> Parameter($stmt, $bvalue, $bkey);
else
$conn -> Parameter($stmt, $bvalue, $bkey, false, - 1 , $types[$bkey]);
}
$r = $conn -> Execute($sql, $bindvalues);
if ($r) {
$result['code'] = ERR_NONE;
$result['ADOcode'] = $conn -> ErrorNo();
$result['ADOmsg'] = $conn -> ErrorMsg();
$result['sql'] = $sql;
} else {
$result['code'] = ERR_DATABASE;
$result['ADOcode'] = $conn -> ErrorNo();
$result['ADOmsg'] = $conn -> ErrorMsg();
$result['sql'] = $sql;
}
} else {
$result = $r;
}
return $result;
}
|
|