如何在 PLSQL 过程中将绑定变量作为 IN OUT 参数传递
Posted
技术标签:
【中文标题】如何在 PLSQL 过程中将绑定变量作为 IN OUT 参数传递【英文标题】:How to pass bind variable as IN OUT parameter in PLSQL procedure 【发布时间】:2020-07-11 11:12:48 【问题描述】:我想使用我的程序 EMP_ID 的第一个参数作为 IN OUT 参数。最初它是 IN 参数,这个过程运行良好,但作为最后一行关注
htp.p('Inserted for Employee-id '||EMP_ID);
我想在匿名块中使用这一行,最重要的是它应该是一个绑定变量,因为我正在创建 REST API,用户将只在其中输入值并将其作为绑定变量在 oracle Apex 中,以下过程在 IN 参数方面运行良好。
create or replace procedure att_time_ins (EMP_ID in varchar2, ORG_ID in number,V_TIME_STATUS in number) is
BEGIN
INSERT INTO TIME_ATTENDANCE_POOL
(EMPLOYEE_ID, ATTENDANCE_DATE,TIME_HOURS,TIME_MINUTES,TIME_STATUS,LOCATION_ID,ORG_ID,PREPARED_ON )
VALUES
(EMP_ID, to_date(sysdate,'DD/MM/YYYY'),to_char(sysdate,'HH24') ,to_char(sysdate,'MI'),V_TIME_STATUS,null,ORG_ID,
to_date(sysdate,'DD/MM/YYYY') );
COMMIT;
time_management.create_attendance_sheet(v_org_id => ORG_ID,
v_employee_id => EMP_ID,
target_date => to_date(sysdate,'DD/MM/YYYY'));
htp.p('Inserted for Employee-id '||EMP_ID);
end att_time_ins;
我以这种方式调用我的程序
begin
att_time_ins(:employee_id,:org_id,:time_status);
end;
请帮我根据 IN OUT 参数修改这些东西,即 Employee_id 应该是 IN OUT 参数。没有关于在 PLSQL 块中传递绑定变量的适当文档。
【问题讨论】:
为什么你认为你需要在通话中做一些不同的事情,一旦你将程序从EMP_ID in varchar2
更改为EMP_ID in out varchar2
?我不明白为什么您需要将其输入/输出,因为您没有更改过程中的值。目前尚不清楚您要解决的实际问题是什么。
在Oracle 或用户编写的过程中,所有形式参数总是由编译器生成为绑定变量。您的过程的形式参数包括 EMP_ID。所以它是一个绑定变量。但除此之外,您的声明不会将其用作输出。在过程中,in out 参数可以用作赋值中的左操作数或右操作数,即您可以更改它的值;您想要的语句不会更改值,因此它不是 OUT。注意:使用 IN OUT( 或 OUT) 的变量与输出不同。您的程序正在运行 - 不要更改任何内容。
但请更改to_date(sysdate,'DD/MM/YYYY')
。你不应该打电话给to_date
的东西是已经一个日期。当您使用 NLS 设置将 sysdate
隐式转换为字符串时。其他人从具有不同设置的会话中调用您的过程将得到不同的行为,并且很可能是错误。如果打算“删除”时间,请改用trunc(sysdate)
,默认情况下会将时间截断到午夜。 (当然,你不能有一个没有时间的约会。)
【参考方案1】:
假设您有一个名为PR_PROC
的过程,您可以使用VARIABLE
语句来传递IN OUT
或OUT
类型的变量。
CREATE OR REPLACE PROCEDURE PR_PROC (EMP_NAME IN VARCHAR2,
EMP_ID IN OUT VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE (EMP_NAME||EMP_ID);
END;
VARIABLE KURSOR VARCHAR2
BEGIN
:KURSOR:='4';
PR_PROC('SENIOR',:KURSOR);
END;
注意:如果您使用的是 TOAD 编辑器,您可以按 F5 使其工作。
Oracle VARIABLE
【讨论】:
以上是关于如何在 PLSQL 过程中将绑定变量作为 IN OUT 参数传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?