oracle - 甲骨文选择为存储过程之后的等价物 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 DUAL
或SELECT 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
是否正在用于出站参数。
解决方案
可能吗?有点儿。这是 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>
推荐阅读
- c - SIGTERM 信号处理程序未打印到控制台
- sql - 如何使用带有别名的子查询更新字段
- ubuntu - 存储缓冲区并保存在触发器上的网络捕获工具集
- express - Nest.js 找不到相关文件
- ios - ITMS-90809:不推荐使用的 API 使用 — 当上传 myApp 时,Apple 将停止接受使用 UIWebView API 的应用程序的提交
- typescript - Typescript noImplicitReturns 拒绝详尽的 if 但接受详尽的开关
- kubernetes - 所有容器都显示就绪,但 pod 尚未就绪
- c++ - 你将如何通过winsock发送一个int数组?
- java - 这行代码是什么意思使用 Iterator 'Student st = (Student)itr.next();'
- apache - 当任何一个处理器报告错误时,我如何接受故障警报?