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】:您了解OUT
和IN OUT
参数的工作原理吗?您不能为 OUT
或 IN 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”关键字?
如何调用具有 IN/OUT 参数并通过 DB Link 返回 BLOB 的 Oracle PL/SQL 函数