【问题标题】:Unexpected results with IN OUT parameter in PL/SQL procedurePL/SQL 过程中带有 IN OUT 参数的意外结果
【发布时间】: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;

【问题讨论】:

    标签: sql oracle plsql oracle-apex


    【解决方案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.
    

    【讨论】:

    • 非常感谢您的解释。
    • 看来答案解决了你的问题,所以请接受它。接受答案有助于未来的提问者有同样的问题,并从未回答的队列中删除问题。请不要将成功回答的问题留作未回答。
    猜你喜欢
    • 2014-08-13
    • 2020-09-09
    • 2015-12-14
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多