четверг, 30 октября 2008 г.

Oracle: Макcимальное количество аргументов хранимой процедуры?

Вопрос возник не на пустом месте, в ходе отладки чужого кода наткнулся на PL/SQL процедуры количество аргументов которых варьировалось от 120 до 190.
Читать текст с объявлением или вызовом такой процедуры весьма нудное занятие, про дебаг и говорить не стоит.

В руководстве слушателя "Oracle Database 10g: Основы PL/SQL" том 1, [9-5] в разделе про синтаксис процедуры написано слудующее:
аргумент - Имя, даваемое параметру процедуры. С каждым аргументом связан
тип_параметра (mode) и тип данных. Допускается любое
количество аргументов, разделенных запятыми.

На самом деле это не так!

Проверка
Выполняем следующий скрипт:
set termout off
store set sqlplus.cfg replace
set pagesize 0
set linesize 10000
set tab off
set trimspool on
set echo off
set verify off
set feedback off
set timing off
set recsep off
spool p_test.sql

SELECT  'create or replace procedure p (' FROM DUAL
/
WITH a AS (  SELECT  LEVEL b
         FROM  DUAL
      CONNECT BY  LEVEL <= 8191)
SELECT  ' p' || b || ' in number,'
 FROM  a
/
SELECT   ' p in number'
     || CHR (10)
     || ' ) as'
     || CHR (10)
     || 'begin'
     || CHR (10)
     || ' null;'
     || CHR (10)
     || 'end;'
     || CHR (10)
     || '/'
 FROM  DUAL
/
spool off
@sqlplus.cfg
set termout on
@p_test.sql


* This source code was highlighted with Source Code Highlighter.


результат:
D:\sqlplus srv@vm @test.sql

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 30 17:48:33 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options


Warning: Procedure created with compilation errors.

SQL> show errors;
Errors for PROCEDURE P:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/0 PLS-00123: program too large (Diana nodes)
SQL>


А вот создать процедуру с 8187 аргуметами вполне возможно.

Если все таки нужно передать много параметров в процедуру или функцию лучше воспользоваться советом Томаса Кайта.

Ссылки:
1. How many parameters can a stored procedure have?
2. PL/SQL User's Guide and Reference Release 2 (9.2) - PL/SQL Program Limits
3. Oracle® Database PL/SQL User's Guide and Reference 10g Release 2 (10.2) - C PL/SQL Program
Limits

4. Writing a function which accepts unlimited parameters

Комментариев нет: