PL/SQL 过程中带有 IN OUT 参数的意外结果

Posted

技术标签:

【中文标题】PL/SQL 过程中带有 IN OUT 参数的意外结果【英文标题】:Unexpected results with IN OUT parameter in PL/SQL procedure 【发布时间】:2022-01-05 22:56:50 【问题描述】:

我的 Databases 类中的一项任务是创建一个格式化电话过程,该过程使用一个 varchar2 in out 参数,该参数是一个未格式化的电话号码并打印一个格式化的版本。

例如:

输入:8006330575

输出:(800)633-0575

我编写的程序看起来不错并且可以编译,但是当我尝试调用它时,我收到一条错误消息:

ORA-06550: line 2, column 14: PLS-00363: expression '8006330575'
cannot be used as an assignment target
ORA-06550: line 2, column 1:  PL/SQL: Statement ignored


1. BEGIN
2. format_phone('8006330575');
3. END;

我尝试过处理输入类型,但似乎没有任何效果。我还尝试在括号中指定 varchar2 参数中的字符数,但是当我这样做时,该过程甚至无法编译。

代码如下:

create or replace PROCEDURE format_phone 
(p_num IN OUT VARCHAR2) IS

BEGIN 

p_num := '(' || SUBSTR(p_num, 1, 3) || ')' || SUBSTR(p_num, 4, 3)
          || '-' || SUBSTR(p_num, 7);
    
DBMS_OUTPUT.PUT_LINE(p_num);

END format_phone;

【问题讨论】:

【参考方案1】:

您了解OUTIN OUT 参数的工作原理吗?您不能为 OUTIN OUT 参数传入 。您必须传递变量的名称,该变量在过程外部和调用过程之前定义并赋值。此外,您只能检查修改后的 (OUT) 值 在过程之外 并在过程执行之后(尽管在过程中您可以打印它的值,但这不是它是 @ 987654326@参数)。

相反,该过程应该是这样的(几乎是您所拥有的,减去从过程中的打印):

create or replace procedure format_phone (p_num in out varchar2) is
begin
  p_num := '(' || substr(p_num, 1, 3) || ')' || substr(p_num, 4, 3)
               || '-' || substr(p_num, 7);
end format_phone;
/

然后你在外部上下文中使用它,就像这样。注意我声明一个变量并为其赋值的匿名块;我打印它;然后我执行该过程,并再次打印变量的值。正如预期的那样,该值已按过程要求更改。

一个小而重要的一点是,我称为num 的变量不能声明为varchar2(10),即使输入是这样。原因是该过程将用更长的字符串替换它,这不适合varchar2(10)。必须注意变量能够容纳 OUT 值!

declare
  num varchar2(30);
begin
  num := '8006330575';
  dbms_output.put_line('Unformatted number: ' || num);
  -- Now call the procedure; the argument is the variable name, NUM
  format_phone(num);
  dbms_output.put_line('Formatted number: ' || num);
end;
/



Unformatted number: 8006330575
Formatted number: (800)633-0575


PL/SQL procedure successfully completed.

【讨论】:

非常感谢您的解释。 看来答案解决了你的问题,所以请接受它。接受答案有助于未来的提问者有同样的问题,并从未回答的队列中删除问题。请不要将成功回答的问题留作未回答。

以上是关于PL/SQL 过程中带有 IN OUT 参数的意外结果的主要内容,如果未能解决你的问题,请参考以下文章

声明 PL/SQL 过程/函数时是不是必须使用“IN”和“OUT”关键字?

pl/sql 中带参数的过程

如何调用具有 IN/OUT 参数并通过 DB Link 返回 BLOB 的 Oracle PL/SQL 函数

从 shell 脚本调用 PL/SQL 存储过程并捕获 out 参数

oracle pl/sql 存储过程

Oracle PL/SQL块之过程