在Oracle Toad中执行以下语句
exec plsql_procedure(select 'somestring' from dual);
表示以下异常:
ORA-06550:第1行,第33栏: PLS-00103:遇到以下任何一种情况时遇到符号“SELECT”:
() - + case mod new not null
过程采用一个VARCHAR2参数。怎么修好?
答案 0 :(得分:3)
除非您使用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;
/
答案 1 :(得分:2)
我尝试过几种方法。其中包括:
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
当事情没有发生时,我们必须忍受其他选择。我们的最终目标只是完成工作。我们为完成它而做了什么并不重要。
答案 2 :(得分:1)
可以是功能,但不适用于程序。请注意,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;
答案 3 :(得分:0)
要记住的一件事是关系查询不返回VALUE - 它返回一个TABLE。即使我们可能知道由于上下文(例如从DUAL中选择一个文字值),特定的SELECT只返回一行,但数据库不知道这一点,并假设SELECT将返回一个包含多行的表。即使SELECT 1 FROM DUAL返回一个表 - 该表有一列和一行,但它仍然是一个表。 : - )
分享并享受。