powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Массив из PHP в Oracle
2 сообщений из 2, страница 1 из 1
Массив из PHP в Oracle
    #32262832
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот хочу передать в процедуру сразу массив из php-
типа:
CREATE OR REPLACE PACKAGE phpArr AS
TYPE t_StIDArr IS TABLE OF students.ID%TYPE
INDEX BY BINARY_INTEGER;
v_StIDArr t_StIDArr;

PROCEDURE InsArr2(p_id IN v_StIDArr%TYPE, v_Totl OUT NUMBER);
END phpArr;

CREATE OR REPLACE PACKAGE BODY phpArr AS
PROCEDURE InsArr2(p_id IN v_StIDArr%TYPE, v_Totl OUT NUMBER)
IS
BEGIN
v_Totl := p_id.COUNT;
END InsArr2;
END phpArr;

Как же туда массив передать на вход?
Делаю из php типа
$sth = OCIParse( $conn,"BEGIN phpArr.InsArr2(:id, :totl); END;" );
$id = array(10,20,30);
OCIBindByName ( $sth, ":id", $id, 100 );
OCIBindByName ( $sth, ":totl", $totl, 100 );
OCIExecute ( $sth );
но по-моему я чегщ-тщ не доганяю?
...
Рейтинг: 0 / 0
Массив из PHP в Oracle
    #32262983
CM Hungry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На тебе кросспост из ораклевого форума. Правда, я не чистый oci использую, а через ADODB.

Код: plaintext
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;
	}
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Массив из PHP в Oracle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]