PL / SQL-函数参数作为表名-怎么可能?

时间:2019-05-04 09:44:27

标签: oracle plsql oracle12c

使用Oracle(使用12c企业版12.1.0.2.0版)时,我们可以编写类似...

SQL> select * from dual ;
DUMMY  
X  

但是,不能像以前那样在FROM子句中使用'a'作为表-例如

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}如何在循环的PL / SQL游标中的SELECT语句的FROM子句中使用参数名称(代表单个varchar2)?

{2}(在示例中)为什么DBMS_OUTPUT.PUT_LINE()显然执行了两次?

1 个答案:

答案 0 :(得分:3)

如果您选择这一行

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

然后Oracle不会从varchar2变量a中进行选择-它从表a中进行选择,巧合的是,该表与您的变量具有相同的名称。