如何在 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 OUTOUT 类型的变量。

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 或嵌套表?

sql select语句作为动态plsql块的绑定变量

IN() 子句 oracle PLSQL 中的数组

ORACLE存储过程怎么调用?

plsql调用oracle存储过程有输入参数和输出参数 sql语句怎么写如题 谢谢了

PLSQL使用绑定变量