【问题标题】:PL/SQL - function parameter as table name - how is this possible?PL/SQL - 作为表名的函数参数 - 这怎么可能?
【发布时间】:2019-05-04 09:44:26
【问题描述】:

使用 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 游标 for 循环中的 SELECT 语句的 FROM 子句中使用参数名称(表示单个 varchar2)?

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

【问题讨论】:

  • 我假设你有一个名为a 的表,试试select * from a,那么你应该会看到它。
  • @WernfriedDomscheit 不,没有名为 a 的表。 a 是单个 varchar2 值。
  • 我怀疑,试试aa,然后你应该得到错误。
  • @WernfriedDomscheit - 你对的!我不应该把测试表留在这个架构中。
  • 这是一个有价值的教导。下次当你发现 Oracle 做了一些奇怪的事情时,记得问问自己,“我忽略了什么明显的事情?”

标签: oracle plsql oracle12c


【解决方案1】:

如果你走这条线

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

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

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2012-06-23
    • 2019-05-26
    • 2021-02-18
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多