Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) выдает ORA-01000 / 3 сообщений из 3, страница 1 из 1
08.02.2013, 15:01
    #38143530
Saules
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) выдает ORA-01000
Доброго всем дня!
помогите разобратся где кроется ошибка:


Код: plsql
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.
   PROCEDURE update_anno(p_amt_id IN NUMBER, p_status IN NUMBER,retcode OUT NUMBER) IS
        existing_record number;  

    BEGIN    
    IF p_status<>2 THEN    
    
       update_log(p_amt_id, p_status,retcode);    
        
    ELSE  
    
        IF p_amt_id IS NOT NULL THEN 
            SELECT count(*) INTO existing_record FROM nc_log WHERE amt_id = p_amt_id;
        END IF;
        
        IF existing_record is null or existing_record = 0 THEN
            INSERT INTO nc_log (amt_id, status,  status_time) 
            VALUES (p_amt_id, p_status,  SYSDATE );
         END IF;   
         
    END IF;
             dbms_output.put_line('amt_id= '||p_amt_id);  
    retcode := 0;
      dbms_output.put_line('3 retcode= '||retcode);
        EXCEPTION
          WHEN OTHERS THEN
            retcode := SQLCODE;
              dbms_output.put_line('4 retcode= '||retcode);
    END;
    
--
    PROCEDURE get_log(anno OUT c_anno) IS    
     retcode NUMBER(10);
     p_amt_id NUMBER(10);
     p_status NUMBER(1);
   
    cursor cur is
    SELECT amt_id,  status
    FROM nc_log  WHERE status_time < SYSDATE;    
  
    BEGIN  
     OPEN cur;
         LOOP      
           FETCH cur INTO p_amt_id, p_status; 
           EXIT WHEN cur%NOTFOUND;         
             IF p_amt_id IS NOT NULL THEN
                update_log(p_amt_id, p_status, retcode);   
             END IF;  
              dbms_output.put_line('amt_id= '||p_amt_id);             
        END LOOP;     
      CLOSE cur; 
--      IF cur%isopen THEN CLOSE cur; END IF;
    END;
--
    PROCEDURE update_log(p_amt_id IN NUMBER, p_status IN NUMBER, retcode OUT NUMBER) IS       
        
    BEGIN       
        UPDATE nc_anno SET status = p_status
            WHERE amt_id = p_amt_id;
    
        END IF; 
        retcode := 0;
        dbms_output.put_line('1 retcode= '||retcode);  
        EXCEPTION
          WHEN OTHERS THEN
            retcode := sqlcode;
          dbms_output.put_line('2 retcode= '||retcode);       
    END;



подавая данные в консоли (debug)
никаких ошибок нет
выполняем update_processing_anno(
amt_id= 479
1 retcode= 0
3 retcode= 0

выполняем get_processing_log
1 retcode= 0
amt_id= 479
1 retcode= 0
amt_id= 478
1 retcode= 0
amt_id= 477
1 retcode= 0
amt_id= 475

но выполняя тоже самое из php
Код: php
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.
		<?php	
				
            $retcode = update_anno($conn, 479, 3, null, null);

        echo(" First: ".$retcode);
		
		function update_anno($conn, $amt_id, $status) {
			$sql = "BEGIN nc_anno_pkg.update_anno(:amt_id, :status,  :retcode); END;";
			$stmt = ociparse($conn, $sql);
			oci_bind_by_name($stmt, ":amt_id", $amt_id);
			oci_bind_by_name($stmt, ":status", $status);
			oci_bind_by_name($stmt, ":retcode", $retcode, 9999999);
			oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
			oci_free_statement($stmt);

			return $retcode;
		}

		$annou = null;
		$sql = "BEGIN nc_anno_pkg.get_log(:anno); END;";
		$stmt = ociparse($conn, $sql);
		$cur = oci_new_cursor($conn);
		oci_bind_by_name($stmt, ":anno", $cur, -1, OCI_B_CURSOR);
		oci_execute($stmt, OCI_DEFAULT);
		oci_execute($cur, OCI_DEFAULT);
		oci_fetch_all($cur, $annou, null, null, OCI_FETCHSTATEMENT_BY_ROW);		
		oci_free_statement($cur);
		oci_free_statement($stmt);
	
		$retcode = update_log($conn, $amt_id, $status);
 
		function update_log($conn, $amt_id, $status) {
			global $conn;
			$sql = "BEGIN nc_anno_pkg.update_log(:amt_id,:status, :retcode); END;";
			$stmt = ociparse($conn, $sql);
			oci_bind_by_name($stmt, ":amt_id", $amt_id);
			oci_bind_by_name($stmt, ":status", $status);
			oci_bind_by_name($stmt, ":retcode", $retcode, 9999999);
			oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
			oci_free_statement($stmt);

			return $retcode;
		} 
		
 echo("<br/> Second: ".$retcode);
		
		?>



какие бы данные не подавались, то в любом получаем:
First: 0
Second: 100
т.е. ORA-01000: maximum open cursors exceeded tips
хотя данные и сохраняются
цикл был пройдем кучу раз и всегда курсор закрывается, да и в php тоже же освобождаем курсор.не могу понять в чем может быть причина?
заранее спасибо за любой совет
p.s. увеличение курсоров исключено.
...
Рейтинг: 0 / 0
11.02.2013, 16:23
    #38146369
Saules
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) выдает ORA-01000
оказалось что не ту ошибку искал.
на самом деле получается pl sql 100 data not found
правильно ли я понимаю, что если в PROCEDURE get_log(anno OUT c_anno) уже есть апдейт, то его не надо вызывать еще раз? и можно обойтись просто

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$annou = null;
		$sql = "BEGIN nc_anno_pkg.get_log(:anno); END;";
		$stmt = ociparse($conn, $sql);
		$cur = oci_new_cursor($conn);
		oci_bind_by_name($stmt, ":anno", $cur, -1, OCI_B_CURSOR);
		oci_execute($stmt, OCI_DEFAULT);
		oci_execute($cur, OCI_DEFAULT); // line 89
		oci_fetch_all($cur, $annou, null, null, OCI_FETCHSTATEMENT_BY_ROW); //line 90		
		oci_free_statement($cur);
		oci_free_statement($stmt);


единственное, что тогда ничего не происходит: база не обновляется
в логах есть варнинги:
[Mon Feb 11 2013] [error] PHP Warning: oci_execute() [<a href='function.oci-execute'>function.oci-execute</a>]: ORA-24338: statement handle not executed in C:\\Program Files (x86)\\Apache Group\\Apache2\\htdocs\\Services.php on line 89
[Mon Feb 11 2013] [error] PHP Warning: oci_fetch_array() expects parameter 1 to be resource, null given in C:\\Program Files (x86)\\Apache Group\\Apache2\\htdocs\\Services.php on line 91
что может вызывать их?
...
Рейтинг: 0 / 0
12.02.2013, 06:56
    #38147106
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) выдает ORA-01000
Кхм... Мне одному кажется, что курсор не используется так как надо и где он вообще используется в процедуре get_log?
P. S. Судя по примеру в мануале по похапе там биндят ссылочную переменную курсора по имени без двоеточия . Не знаю, может это никакой роли не играет, но стоит обратить внимание.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) выдает ORA-01000 / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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