Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 scalar subquery and cursor subquery as parameters  [new]
Dnipro
Member

Откуда: Днепропетровск
Сообщений: 180
Доброй ночи!
Имею две функции:
SQL> CREATE OR REPLACE FUNCTION f1(p IN NUMBER) RETURN NUMBER IS
  2  BEGIN
  3      RETURN(p);
  4  END f1;
  5  /
 
Function created
SQL> CREATE OR REPLACE FUNCTION f2(p IN SYS_REFCURSOR) RETURN NUMBER IS
  2      RESULT NUMBER := 0;
  3      tmp    NUMBER;
  4  BEGIN
  5      LOOP
  6          FETCH p
  7              INTO tmp;
  8          EXIT WHEN p%NOTFOUND;
  9          RESULT := RESULT + 1;
 10      END LOOP;
 11      RETURN(RESULT);
 12  END f2;
 13  /
 
Function created
Все способы работают:
SQL> DECLARE
  2      cv SYS_REFCURSOR;
  3      x1 NUMBER;
  4      x2 NUMBER;
  5  BEGIN
  6      -- 1-й случай
  7      OPEN cv FOR SELECT 1 FROM dual;
  8      SELECT f1(1) INTO x1 FROM dual;
  9      SELECT f2(cv) INTO x2 FROM dual;
 10      -- 2-й случай
 11      OPEN cv FOR SELECT 1 FROM dual;
 12      dbms_output.put_line(f1(1));
 13      dbms_output.put_line(f2(cv));
 14      -- 3-й случай
 15      OPEN cv FOR SELECT 1 FROM dual;
 16      x1 := f1(1);
 17      x2 := f2(cv);
 18  END;
 19  /
 
PL/SQL procedure successfully completed
Только первый способ работает:
SQL> DECLARE
  2      x1 NUMBER;
  3      x2 NUMBER;
  4  BEGIN
  5      SELECT f1((SELECT COUNT(*) FROM all_objects)) INTO x1 FROM dual;
  6      SELECT f2(CURSOR (SELECT object_id FROM all_objects))
  7        INTO x2
  8        FROM dual;
  9  END;
 10  /
 
PL/SQL procedure successfully completed
SQL> BEGIN
  2      dbms_output.put_line(f1((SELECT COUNT(*) FROM all_objects)));
  3  END;
  4  /
 
BEGIN
    dbms_output.put_line(f1((SELECT COUNT(*) FROM all_objects)));
END;
 
ORA-06550: line 3, column 26:
PLS-00122: CURSOR as separator is allowed only with specific built-in functions
ORA-06550: line 0, column 0:
PLS-00801: internal error [56402]
SQL> BEGIN
  2      dbms_output.put_line(f2(CURSOR (SELECT object_id FROM all_objects)));
  3  END;
  4  /
 
BEGIN
    dbms_output.put_line(f2(CURSOR (SELECT object_id FROM all_objects)));
END;
 
ORA-06550: line 3, column 29:
PLS-00405: subquery not allowed in this context
ORA-06550: line 3, column 5:
PL/SQL: Statement ignored
SQL> DECLARE x1 NUMBER;
  2  BEGIN
  3      x1 := f1((SELECT COUNT(*) FROM all_objects));
  4  END;
  5  /
 
DECLARE x1 NUMBER;
BEGIN
    x1 := f1((SELECT COUNT(*) FROM all_objects));
END;
 
ORA-06550: line 4, column 15:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

   ( - + case mod new not null others <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> avg
   count current exists max min prior sql stddev sum variance
   execute forall merge time timestamp interval date
   <a string literal with character set specification>
   <a number> <a single-quoted SQL string> pipe
   <an alternatively-quoted string literal with character set specification>
   <an alternativ
ORA-06550: line 4, column 47:
PLS-00103: Encountered the symbol ")" when expecting one of the following:

   . , @ ; for <an identifier>
   <a double-quoted delimited-identifier> group having intersect
   minus order partition start subpartition union where connect
SQL> DECLARE x2 NUMBER;
  2  BEGIN
  3      x2 := f2(CURSOR (SELECT object_id FROM all_objects));
  4  END;
  5  /
 
DECLARE x2 NUMBER;
BEGIN
    x2 := f2(CURSOR (SELECT object_id FROM all_objects));
END;
 
ORA-06550: line 4, column 14:
PLS-00405: subquery not allowed in this context
ORA-06550: line 4, column 5:
PL/SQL: Statement ignored
Подскажите, где описано такое поведение в документации, а то не могу найти...
23 июл 10, 03:17    [9147643]     Ответить | Цитировать Сообщить модератору
 Re: scalar subquery and cursor subquery as parameters  [new]
Dnipro
Member

Откуда: Днепропетровск
Сообщений: 180
Имею в виду, почему если передаем скаляр и соответственно cursor() то вызовы можно осуществлять только как в первом случае.
23 июл 10, 03:20    [9147646]     Ответить | Цитировать Сообщить модератору
 Re: scalar subquery and cursor subquery as parameters  [new]
-2-
Member

Откуда:
Сообщений: 15330
Dnipro
Подскажите, где описано такое поведение в документации, а то не могу найти...
Если бы в документации описывали все, что не должно работать... PL/SQL не позволяет непосредственно использовать sql-expression. А интеракция с SQL описана в разделах Using Static/Dynamic SQL.
23 июл 10, 03:47    [9147655]     Ответить | Цитировать Сообщить модератору
 Re: scalar subquery and cursor subquery as parameters  [new]
Elic
Member

Откуда:
Сообщений: 29977
Dnipro
Подскажите, где описано такое поведение в документации, а то не могу найти...
RTFM PL/SQL Expressions and Comparisons (FAQ)
23 июл 10, 10:28    [9148386]     Ответить | Цитировать Сообщить модератору
 Re: scalar subquery and cursor subquery as parameters  [new]
Dnipro
Member

Откуда: Днепропетровск
Сообщений: 180
Elic
Dnipro
Подскажите, где описано такое поведение в документации, а то не могу найти...
RTFM PL/SQL Expressions and Comparisons (FAQ)

Спасибо.
23 июл 10, 12:02    [9149200]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить