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;
/
0
我尝试过几种方法 . 其中包括:
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;
/
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;
4 回答
除非你使用select from dual只是其他一些例子,否则请忽略选择 .
否则,选择一个变量并将其传递给过程 .
我尝试过几种方法 . 其中包括:
以上都没有奏效 . 看起来Oracle在任何情况下都不允许在参数列表中使用
SELECT
语句 .我做的一件事是将
SELECT
查询结果存储到变量中,并在以后使用它,如下所示:Output:
当事情没有发生时,我们必须接受替代方案 . 我们的最终目标只是完成工作 . 我们为完成它而做了什么并不重要 .
功能可能,但不适用于程序 . 请注意,
select
需要括在括号中,因此在下面的选择中使用双括号 .要记住的一件事是关系查询不返回VALUE - 它返回一个TABLE . 即使我们可能知道由于上下文(例如从DUAL中选择一个文字值),特定的SELECT只返回一行,但数据库不知道这一点,并假设SELECT将返回一个包含多行的表 . 即使SELECT 1 FROM DUAL返回一个表 - 该表有一列和一行,但它仍然是一个表 . :-)
分享和享受 .