PL / SQL - параметр функции в качестве имени таблицы - как это возможно? - PullRequest
0 голосов
/ 04 мая 2019

При работе с Oracle (с использованием 12c Enterprise Edition Release 12.1.0.2.0) мы можем написать что-то вроде ...

SQL> select * from dual ;
DUMMY  
X  

Однако невозможно использовать «а» вПредложение FROM, как таблица, как это было - например,

SQL> select * from 'a' ;

Error starting at line : 1 in command -
select * from 'a'
Error at Command Line : 1 Column : 15
Error report -
SQL Error: ORA-00903: invalid table name
00903. 00000 -  "invalid table name"
*Cause:    
*Action:

При кодировании CURSOR FOR LOOP (PL / SQL) я обнаружил, что скомпилирован следующий код функции:

create or replace function f (
  a varchar2
) return varchar2
is
begin
  for r in ( select * from a )  -- parameter (type varchar2) as table name!
  loop
    dbms_output.put_line( ' a -> ' || a  ) ;
  end loop;
  return a ;
end f ;
/

Function F compiled

Тестирование

set serveroutput on

SQL> select f( 'z' ) from dual ;
F('Z')  
z       


a -> z
 a -> z

Вопросы

{1} Как возможно, что мы можем использовать имя параметра (которое представляет один varchar2) в предложении FROM оператора SELECT в PL /Курсор SQL для цикла?

{2} (В примере) Почему DBMS_OUTPUT.PUT_LINE (), по-видимому, выполняется дважды?

1 Ответ

3 голосов
/ 04 мая 2019

Если вы берете эту строку

for r in ( select * from a ) -- parameter (type varchar2) as table name!

Тогда доза Oracle не выбирается из переменной varchar2 a - она ​​выбирает из таблицы a, которая по совпадению имеет то же имя, что и ваша переменная.

...