![]() |
|
Программирование >> Oracle
Внешние процедуры на языке С 1353 * Действие: другие сообщения об ошибках (если они есть) подскажут причину выдачи этого сообщения. После этого сообщения об ошибке должно быть выдано специфическое сообщение об ошибке ОС. Чтобы продемонстрировать эту ошибку, я сделал следующее: $ cp lobtofile.pc extproc.so То есть скопировал исходный код поверх .so-файла, что, определенно, должно вызвать проблемы. Теперь при попытке вызвать внешнюю процедуру я получаю: declare х clob; у number; begin у := lob io.write(x, х); end; at line 1: ORA-06520: PL/SQL: Error loading external library ORA-06522: ld.so.l:extprocPLSExtProc:fatal:/export/home/tkyte/src/ lobtofile/extproc.so: unknown file type ORA-06512: at OPS$TKYTE.LOB IO , line 0 ORA-06512: at line 1 Итак, как видите, среди сообщений об ошибках есть сообщение ОС, свидетельствующее о неизвестном типе файла, что и поможет выявить причину возникновения ошибки (в данном случае все просто: при просмотре файла extproc.se оказывается, что он содержит исходный код на языке С). ORA-06521 PL/SQL: ошибка отображения функции $ oerr ora 6521 06521, 00000, PL/SQL: Error mapping function * Причина: ошибка возникла при попытке динамического сопоставления с указанной функцией в PL/SQL. * Действие: другие сообщения об ошибках (если они есть) подскажут причину выдачи этого сообщения. Эта ошибка обычно возникает по одной из следующих причин: в имени внешней процедуры в оболочке PL/SQL или в коде на языке С сделана ошибка; разработчик заб1л экспортировать функцию в Windows ( declspec( dllexport)). Для демонстрации этой ошибки я изменил исходный код в файле lobtofile.pc следующим образом: tifdef WIN NT dec1spec (dllexport) #endif int xlobToFile(OCIExtProcContext * ctx, char * filename, Я добавил х к имени файла. Теперь при попытке выполнения мы получаем: declare х clob; у number; begin у := lob io.write(x, x); end; ERROR at line 1: ORA-06521: PL/SQL: Error mapping function 1354 Глава 18 ORA-0 6 52 2: ld.so.l: extprocPLSExtProc: fatal: lobToFile: cant find symbol OPA-06512: at OPS$TKYTE.LOB IO , line 0 ORA-06512: at line 1 Это показывает, что причина ошибки - cant find symbol, т.е. нет соответствия ж-ду именем, указанным в PL/SQL-коде, и именем функции во внешней библиотеке. Либо вкралась опечатка, либо имя функции не экспортировано (в среде Windows). ORA-06523 превышено максимальное количество аргументов $ oerr ora 6523 06523, 00000, Maximum number of arguments exceeded * Причина: веется ограничение на количество аргументов, которые можно передавать внешней функции. * Действие: в документации для своей версии сервера и платформы проверьте, как вычисляется максимальное количество аргументов. Это сообщение об ошибке можно получить в случае слишком большого списка параметров. Во внешние процедуры обычно можно передавать до 128 параметров (меньше, если передаются числа двойной точности, double, поскольку они занимают 8 байт, а не 4). При получении этого сообщения об ошибке, если действительно необходимо передавать столько параметров, проще всего обойти это ограничение с помощью набора. Например, следующий фрагмент: 1 declare 2 l input strArray := strArray(); 3 l output strArray := strArray(); 4 begin 5 dbms output.put line(Pass strArray) ; 6 for i in 1 .. 1000 loop 7 l input.extend; 8 linput(i) := Element i; 9 end loop; 10 demo passing pkg.pass(l input, l output); 11 dbms output.put line(l input.count = l input.count 12 l output.count = l output.count); 13 for i in 1 .. l input.count loop 14 if (l input(i) != l output(i)) then 15 raise program error; 16 end if; 17 end loop; 18* end; SQL> / Pass strArray l input.count = 1000 l output.count = 1000 PL/SQL procedure successfully completed. показывает, что с помощью набора я могу передавать внешней процедуре 1СОО строк -во много раз превысив ограничение на количество параметров. Внешние процедуры на языке С 1355 ORA-06525 неправильная длина для данных типа CHAR или RAW 06525, 00000 , Length Mismatch for CHAR or RAW data * Причина: значение, указанное в переменной, задающей длину строки, недопустимо. Эта ошибка может произойти, если в PL/SQL переменная типа RAW указана в качестве параметра, передаваемого в режиме INOUT, OUT или в качестве возвращаемого значения, но соответствующая переменная, задающая длину, не передана. Эта ошибка может также возникать при несоответствии заданного в переменной значения длины фактической длине данных типа orlvstr или orlraw. * Действие: исправьте код внешней процедуры и правильно задайте переменную, определяющую длину. Это сообщение об ошибке, если вы следуете моим принципам передачи и возврата параметров, может произойти только в случае возвращения из функции данных типа и строки. Решение проблемы очень простое: надо правильно задать длину. Для пустого параметра типа RAW, переданного в режиме OUT, необходимо установить длину 0, как делалось в представленных выше примерах. Для непустого параметра типа RAW, переданного в режиме OUT, длина должна быть меньше или равна атрибуту MAXLEN. Аналогично, длина возвращаемой строки тоже должна устанавливаться правильно: меньше чем MAXLEN, но, поскольку память для строки выделяет внешняя процедура, значения MAXLEN она не получает, поэтому атрибут LENGTH должен быть меньше или равен 32760 (максимальное значение, которое может быть обработано в PL/SQL). ORA-06526 невозможно загрузить библиотеку PL/SQL $ oerr ora 6526 06526, 00000, Unable to load PL/SQL library * Причина: PL/SQL не смог загрузить библиотеку, на которую ссыпается конструкция EXTERNAL. Это серьезная ошибка, которая обычно не возникает. * Действие: сообщите о проблеме службе поддержки. Это внутренняя ошибка. Сообщение о ней выдаваться не должно, но если уж оно получено, возможны два варианта. Во-первых, это сообщение об ошибке может сопровождаться другим, более деталь-н1м сообщением. Например: ERROR at line 1: ORA-6526: Unable to load PL/SQL library ORA-4030: out of process memory when trying to allocate 65036 bytes (callheap,KQL tmpbuf) Второе сообщение самоочевидно: не хватает памяти. Необходимо сократить объем используемой сеансом памяти. Если же сопровождающее ошибку ORA-6526 сообщение не позволяет понять причину ошибки, обращайтесь в службу поддержки.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |