存储过程之后的等价物 where is an outbound parameter (JDBC/SQL Only no SQL*Plus),oracle,stored-procedures,parameters"/>

首页 > 解决方案 > 甲骨文选择存储过程之后的等价物 where is an outbound parameter (JDBC/SQL Only no SQL*Plus)

问题描述

除了使用 usingDBMS_OUTPUT来呈现从存储过程返回的返回变量的内容之外,Oracle 还有其他方法SELECT吗?

我也知道函数,但我在重写东西方面没有发言权,以防人们正在考虑回应。

DECLARE
NAME TIDAL.JOBMST.JOBMST_NAME%TYPE; -- Oracle syntax to base the type of variable upon a column in a table. It resolves to varchar2(256) 
BEGIN
TIDAL.GETJOBNAMEFORID(1,NAME); -- 'NAME' is an outbound parameter of stored procedure and gets bound to variable 'NAME' in DECLARE above.
DBMS_OUTPUT.PUT_LINE('Name: ' || NAME); -- || is Oracle string concat `+` anywhere else!
END;

通过 JDBC 处理此 SQL 的程序需要能够将输出呈现为 CSV、XML 或原始负载。它只能使用 " select" 样式输出来完成所有这些选项。(可能使用 Java 的Resultset API)

DBMS_OUTPUT.PUTLINE不会在处理 SQL 的程序中生成输出。DBeaver 可以。所以这对我也不起作用。


我认为我可以使用一些尴尬SELECT :NAME FROM DUALSELECT NAME: = NAME INTO DUAL语法来呈现它,因为 Oracle 不允许SELECT没有FROM类似于 SQL Server 的 a (见下文),但解决方案让我望而却步。

在这种情况下,结果是一个标量,但它同样可以是一个或多个记录,或单列的行。我想使用AS它以便能够为下游流程标记列。

有人可以告诉我这是否可能吗?

该代码必须通过 JDBC SQL 解析器语法检查并且不会生成 ORA 错误代码。我在 Internet 上看到的 Oracle 上的大部分解决方案似乎都是不稳定的。SQL*Plus 回答了类似var或似乎不适用于 JDBC SQL 之exec类的问题。print我也一直在尝试通过 DBeaver 验证事情 - 大多数时候冒号前面的变量名似乎提示输入,所以我不确定那/我的 Oracle 知识是否混淆了水域,我应该尝试 SQL开发人员改为验证代码。


这在 SQL Server 中相当于我想在 Oracle 中实现的目标:

DECLARE 
@NAME varchar(256),
EXEC GETJOBNAMEFORID
     1
     @NAME = @NAME OUTPUT;
SELECT @NAME As Name

除了这个罐头示例之外,我也无法查看存储过程以了解 asys_refcursor是否正在用于出站参数。

标签: oraclestored-proceduresparameters

解决方案


可能吗?有点儿。这是 SQL*Plus(命令行工具):

带有 OUT 参数的过程(就像你的一样):

SQL> create or replace procedure p_test (par_deptno in dept.deptno%type,
  2                                      par_dname out dept.dname%type)
  3  as
  4  begin
  5    select dname
  6      into par_dname
  7      from dept
  8      where deptno = par_Deptno;
  9  end;
 10  /

Procedure created.

声明一个变量:

SQL> var v_dname varchar2(20);

执行程序:

SQL> exec p_test(10, :v_dname);

PL/SQL procedure successfully completed.

打印结果:

SQL> print v_dname

V_DNAME
--------------------------------------------------------------------------------
ACCOUNTING

SQL>

如果过程返回很多行怎么办?然后你可以返回 refcursor:

SQL> create or replace procedure p_test (par_deptno in dept.deptno%type,
  2                                      par_dname out sys_refcursor)
  3  as
  4  begin
  5    open par_dname for
  6      select dname
  7      from dept
  8      where deptno <= par_deptno;
  9  end;
 10  /

Procedure created.

SQL> var v_dname refcursor
SQL>
SQL> exec p_test(40, :v_dname);

PL/SQL procedure successfully completed.

SQL> print v_dname

DNAME
--------------
ACCOUNTING
RESEARCH
SALES
OPERATIONS

SQL>

推荐阅读