如何在 oracle sql 开发人员中 select 存储过程输出参数作为 table
How to select stored procedure output parameters as a table in oracle sql developer
我有程序
create or replace PROCEDURE proc
(
p1 IN varchar2,
p2 IN varchar2,
p3 OUT varchar2
) AS
BEGIN
p3:= p1 || ' ' || p2
END proc
我叫它
Declare
P3 varchar(50);
Begin
proc('foo', 'bar', P3)
END;
我可以使用
打印出P3的值
Dbms_Output.Put_line('P3: ' || P3)
但我需要从 select 中获取 table 结果。
我能想到的最好的方法是
Declare
P3 varchar(50);
Begin
proc('foo', 'bar', P3)
END;
SELECT &&P3 from dual;
但这给了我一个错误
Error report -
ORA-06550: line 5, column 12:
PL/SQL: ORA-00936: missing expression
ORA-06550: line 5, column 5:
PL/SQL: SQL statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilatiopn error.
*Action:
是否有某种方法可以将参数的值 select 转换为 column/row 值?
我需要在单个 sql 查询中完成这一切,因为我需要通过链接服务器从另一台服务器执行它。
我没有在数据库上创建任何其他存储过程、函数或 table 的权限。
对我来说,最直接的选择是创建一个函数 - 它应该 return 一个值:
create or replace function proc (p1 IN varchar2, p2 IN varchar2)
return varchar2
AS
BEGIN
return p1 || ' ' || p2;
END proc;
然后你可以这样称呼它
select proc('a', 'b') from dual;
说您“无权创建...函数”- 好吧,如果您被授权创建一个 PROCEDURE,那么您也被授权创建一个 FUNCTION。是一样的特权。
如果您只能使用已经创建的过程,那么:
SQL> create or replace PROCEDURE proc
2 (
3 p1 IN varchar2,
4 p2 IN varchar2,
5 p3 OUT varchar2
6 ) AS
7 BEGIN
8 p3:= p1 || ' ' || p2;
9 END ;
10 /
Procedure created.
SQL> var result varchar2(20)
SQL>
SQL> exec proc('a', 'b', :result);
PL/SQL procedure successfully completed.
SQL> print :result
RESULT
--------------------------------
a b
SQL> select :result from dual;
:RESULT
--------------------------------
a b
SQL>
如果您使用的是 Oracle 12c 以上版本,则可以使用添加到该版本的 WITH FUNCTION
功能。有了它,您可以将您的过程包装到 PL/SQL 本地定义的函数块中,并在 SELECT
中使用该函数。不需要 CREATE PROCEDURE
即可工作。
create procedure proc (
p1 in int,
p2 in int,
pout out int
)
as
begin
pout := p1 + p2;
end;
/
✓
with function f(
p1 in int,
p2 in int
) return int
as
pout int;
begin
proc(p1, p2, pout);
return (pout);
end;
select f(1,2)
from dual
| F(1,2) |
| -----: |
| 3 |
db<>fiddle here
我有程序
create or replace PROCEDURE proc
(
p1 IN varchar2,
p2 IN varchar2,
p3 OUT varchar2
) AS
BEGIN
p3:= p1 || ' ' || p2
END proc
我叫它
Declare
P3 varchar(50);
Begin
proc('foo', 'bar', P3)
END;
我可以使用
打印出P3的值Dbms_Output.Put_line('P3: ' || P3)
但我需要从 select 中获取 table 结果。 我能想到的最好的方法是
Declare
P3 varchar(50);
Begin
proc('foo', 'bar', P3)
END;
SELECT &&P3 from dual;
但这给了我一个错误
Error report -
ORA-06550: line 5, column 12:
PL/SQL: ORA-00936: missing expression
ORA-06550: line 5, column 5:
PL/SQL: SQL statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilatiopn error.
*Action:
是否有某种方法可以将参数的值 select 转换为 column/row 值?
我需要在单个 sql 查询中完成这一切,因为我需要通过链接服务器从另一台服务器执行它。
我没有在数据库上创建任何其他存储过程、函数或 table 的权限。
对我来说,最直接的选择是创建一个函数 - 它应该 return 一个值:
create or replace function proc (p1 IN varchar2, p2 IN varchar2)
return varchar2
AS
BEGIN
return p1 || ' ' || p2;
END proc;
然后你可以这样称呼它
select proc('a', 'b') from dual;
说您“无权创建...函数”- 好吧,如果您被授权创建一个 PROCEDURE,那么您也被授权创建一个 FUNCTION。是一样的特权。
如果您只能使用已经创建的过程,那么:
SQL> create or replace PROCEDURE proc
2 (
3 p1 IN varchar2,
4 p2 IN varchar2,
5 p3 OUT varchar2
6 ) AS
7 BEGIN
8 p3:= p1 || ' ' || p2;
9 END ;
10 /
Procedure created.
SQL> var result varchar2(20)
SQL>
SQL> exec proc('a', 'b', :result);
PL/SQL procedure successfully completed.
SQL> print :result
RESULT
--------------------------------
a b
SQL> select :result from dual;
:RESULT
--------------------------------
a b
SQL>
如果您使用的是 Oracle 12c 以上版本,则可以使用添加到该版本的 WITH FUNCTION
功能。有了它,您可以将您的过程包装到 PL/SQL 本地定义的函数块中,并在 SELECT
中使用该函数。不需要 CREATE PROCEDURE
即可工作。
create procedure proc ( p1 in int, p2 in int, pout out int ) as begin pout := p1 + p2; end; /
✓
with function f( p1 in int, p2 in int ) return int as pout int; begin proc(p1, p2, pout); return (pout); end; select f(1,2) from dual
| F(1,2) | | -----: | | 3 |
db<>fiddle here