在 Oracle Toad 中执行以下语句
exec plsql_procedure(select 'somestring' from dual);
引发以下异常:
ORA-06550:第 1 行,第 33 列:PLS-00103:在预期以下情况之一时遇到符号“SELECT”:
( ) - + case mod new 不为空
过程采用一个 VARCHAR2 参数。如何修复?
除非您使用 select from dual 只是其他示例,否则请忽略选择。
exec plsql_procedure('somestring');
否则,选择一个变量并将其传递给过程。
declare
my_var table_name.column_name%Type;
begin
select column_name
into my_var
from table_name
where ...;
plsql_procedure(parameter_name => my_var);
end;
/
我尝试了几种方法。其中包括:
exec plsql_procedure((select 'somestring' from dual));
EXECUTE IMMEDIATE ('testProc('''||(SELECT 'Testing' FROM dual)||''')');
EXECUTE IMMEDIATE ('EXEC testProc('''||(SELECT 'Testing' FROM dual)||''')');
以上都没有奏效。看起来 Oracle 在任何情况下都不允许SELECT
在参数列表中使用语句。
我做的一件事是将SELECT
查询结果存储到一个变量中,然后像下面这样使用它:
CREATE OR REPLACE PROCEDURE testProc (
testVar IN VARCHAR2 -- Proc accepts VARCHAR2
) IS
BEGIN
dbms_output.put_line(testVar);
END;
/
SET SERVEROUTPUT ON
DECLARE
testVarIn VARCHAR(2000); -- Declare the variable
BEGIN
SELECT 'Testing' INTO testVarIn FROM dual;
-- Accept its value using SELECT ... INTO
testProc(testVarIn); -- Use the variable value to pass to the proc
END;
/
输出:
PROCEDURE testProc compiled
anonymous block completed
Testing
当事情没有发生时,我们必须接受替代方案。我们的最终目标只是完成工作。我们做什么来完成它并不重要。
函数可以,但过程不行。请注意,select
需要用括号括起来,因此下面选择中的双括号。
create or replace function foo (x varchar2) return integer is
begin
--Do various stuff;
return 1;
end;
/
select foo((select 'somestring' from dual)) from dual;
要记住的一件事是关系查询不返回值 - 它返回一个表。尽管由于上下文(例如从 DUAL 中选择文字值)我们可能知道特定的 SELECT 只会返回单行,但数据库不知道这一点,并且会假设 SELECT 将返回包含多行的表。甚至 SELECT 1 FROM DUAL 返回一个表——这个表只有一列和一行,但它仍然是一个表。:-)
分享和享受。