Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Массив из PHP в Oracle / 2 сообщений из 2, страница 1 из 1
11.09.2003, 18:08
    #32262832
oson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив из PHP в Oracle
Вот хочу передать в процедуру сразу массив из 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
11.09.2003, 21:51
    #32262983
CM Hungry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массив из PHP в Oracle
На тебе кросспост из ораклевого форума. Правда, я не чистый 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
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Массив из PHP в Oracle / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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