如何在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)

但是我需要得到结果作为一个表,我可以从中选择。我能想到的最好方法是

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:

是否有一些方法选择参数的值作为列/行值?

我需要在单个sql查询中完成这一切,因为我需要通过链接服务器从另一个服务器执行它。

我没有权限在数据库上创建任何其他存储过程、函数或表。

对我来说,最直接的选择是创建一个函数——它应该返回一个值:

create or replace function proc (p1 IN varchar2, p2 IN varchar2)
return varchar2
AS
BEGIN
return p1 || ' ' || p2;
END proc;

那么你就叫它e.g.

select proc('a', 'b') from dual;

说你没有权限创建…functions"-好吧,如果你被授予创建一个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<此处小提琴>

最新更新