PHP 7.2 OCI8 Oracle 9i Ошибка в коде PL/SQL: ORA-06550: строка 1, столбец 7: PLS-00103: обнаружен символ

Спасибо за помощь, которую вы можете мне дать.

У меня возникла проблема с использованием OCI8 в PHP 7.2 с операторами PL/SQL в Oracle 9i. Я использую мгновенный клиент оракула 11.2.

SQL:

BEGIN 
  DBMS_OUTPUT.put_line('¡Hola Mundo!'); 
END;

PHP:

$rs = oci_parse($conn, $SqlCode);
$RExec = @oci_execute($rs);

ОШИБКА:

ORA-06550: строка 1, столбец 7: PLS-00103: обнаружен символ "" при ожидании одного из следующих действий: начало регистра объявление выхода для перехода к модулю цикла null прагма поднять возврат выбрать обновление в то время как с ‹‹ закрыть текущую удалить блокировку выборки вставить открыть точку сохранения отката установить sql выполнить фиксацию для всех каналов слияния Символ "" был проигнорирован. ORA-06550: строка 2, столбец 42: PLS-00103: обнаружен символ "" при ожидании одного из следующих действий: начало регистра объявление конца исключения выход из цикла goto if mod null прагма поднять возврат выбрать обновление в то время как с


У меня проблемы со всеми операторами PL/SQL в Oracle 9i, но если я попробую базовый оператор, такой как "SELECT * FROM some_table", он будет работать правильно.

Если я выполняю один и тот же оператор PL/SQL в базе данных Oracle 10 и 11, он работает нормально.


ОБНОВЛЕНИЕ 2020-02-04:

У меня есть портал PHP, в котором есть форма для сохранения скриптов (PL/SQL Oracle) в базе данных MYSQL, затем в другом представлении я выбираю скрипт, который хочу выполнить, поэтому я получаю скрипт (PL/SQL), который Я хочу работать в базе данных Oracle.

Закрывая проблему, я обнаружил, что если я прочитаю код или скрипт PL/SQL из базы данных MYSQL, а затем выполню его, я получу ошибку "ORA-06550: строка 1, столбец 7: PLS-00103: Обнаружено символ", но если я возьму код и сохраню его в переменной прямо в файле PHP, он его правильно выполнит.

Таким образом, проблема должна быть связана с проблемой кодирования символов, когда я вставляю или запрашиваю базу данных MYSQL, чтобы получить код pl/sql, который я намереваюсь выполнить в базе данных Oracle.

Спасибо.


person Santiago Zuluaga    schedule 30.01.2020    source источник
comment
Как вы объявляете/устанавливаете $SqlCode? Полагаю, я бы подумал, не является ли это проблемой разрыва строки/возврата каретки, исходя из сообщенной позиции ошибок.   -  person Alex Poole    schedule 31.01.2020
comment
@AlexPoole $SqlCode = BEGIN DBMS_OUTPUT.put_line('¡Hola Mundo!'); КОНЕЦ;; Больше ничего.   -  person Santiago Zuluaga    schedule 31.01.2020
comment
@AlexPoole Я добавил дополнительную информацию к вопросу.   -  person Santiago Zuluaga    schedule 04.02.2020
comment
Тогда я не могу помочь с этим; Я бы посоветовал вам проверить значение, полученное из My SQL, чтобы увидеть, добавляются ли какие-либо невидимые/недопустимые символы, проверить наборы символов обоих соединений, возможно, попробовать сохранить один и тот же блок PL/SQL в виде одной строки (без разрывов строк) чтобы увидеть, работает ли это. На самом деле это не то, с чем мы можем помочь, вам нужно отладить его на своем портале, чтобы увидеть, что сохраняется/получается/выполняется. как только вы узнаете, что происходит, кто-то сможет помочь вам избежать этого, возможно, с помощью нового вопроса.   -  person Alex Poole    schedule 04.02.2020


Ответы (1)


в соответствии с документом на https://www.php.net/manual/en/function.oci-parse.php

вы не включаете final ; это подразумевается

например, их пример

$stid = oci_parse($conn, 'ВЫБЕРИТЕ * ОТ сотрудников');

Попробуйте отказаться от финала ;

person Shaun Peterson    schedule 04.02.2020
comment
Когда вы используете PL/SQL, вам нужно добавить ; в конце. php.net/manual/en/function.oci-parse.php< /а> - person Santiago Zuluaga; 04.02.2020