小代码sn-p不会产生错误ORA-00907: missing
right parenthesis。该错误要么来自周围的上下文
代码 sn-p,或在通过调用 f_query_one 运行的代码中。
下面,我显示
- 调用中值的双引号不起作用。在
Oracle 双引号是一种指定标识符的方法
遵循正常的标识符规则。这种情况下的错误是
ORA-06576: 不是有效的函数或过程名称
- 在调用过程时使用单引号有效。
- 调用函数时,需要指定
into子句
接收返回值。否则错误ORA-06576: not a valid
函数或过程名称将被提出。
在任何情况下都不会引发 ORA-00907:缺少右括号
请查看更广泛的上下文以找出错误的原因。
以下是与 SQL*Plus 的交互。 SQL> 是一个提示
新命令,下面的行带有附加行的数字
对于那个命令。其他所有内容都由 SQL*Plus 打印。
使dbms_output 包的输出可见。
SQL> set serveroutput on size unlimited
创建一个过程f_query_one,从你的
样本。根据传入的值猜测类型
样本。请注意,我没有 SB_COURSE 架构。那将是一个
与我下面的示例以及您的代码 sn-p 的区别。
SQL> create or replace procedure f_query_one(p_subj_code in varchar2
2 , p_crse_numb in varchar2
3 , p_eff_term in varchar2)
4 is begin
5 dbms_output.put_line('Hello World!');
6 end f_query_one;
7 /
Procedure created.
按照您的问题中发布的方式调用,并发现双引号没有
工作。
SQL> call f_query_one(
2 p_subj_code => "LMA",
3 p_crse_numb => "400",
4 p_eff_term => 201203
5 );
p_subj_code => "LMA",
*
ERROR at line 2:
ORA-06576: not a valid function or procedure name
用单引号调用。有效!
SQL> call f_query_one(p_subj_code => 'LMA'
2 , p_crse_numb => '400'
3 , p_eff_term => 201203);
Hello World!
Call completed.
删除过程并创建一个名为 f_query_one 的函数。
SQL> drop procedure f_query_one;
Procedure dropped.
SQL> create or replace function f_query_one(p_subj_code in varchar2
2 , p_crse_numb in varchar2
3 , p_eff_term in varchar2) return varchar2
4 is begin
5 return 'Hello World!';
6 end f_query_one;
7 /
Function created.
调用函数。但是函数确实存在,为什么说不存在呢?
SQL> call f_query_one(p_subj_code => 'LMA'
2 , p_crse_numb => '400'
3 , p_eff_term => 201203);
call f_query_one(p_subj_code => 'LMA'
*
ERROR at line 1:
ORA-06576: not a valid function or procedure name
创建一个绑定变量。 var 是一个 SQL*Plus 命令。它是一部分
既不是 SQL 也不是 PL/SQL 语言。
SQL> var so varchar2(20)
添加into 子句将值保存在绑定变量中。
SQL> call f_query_one(p_subj_code => 'LMA'
2 , p_crse_numb => '400'
3 , p_eff_term => 201203) into :so;
Call completed.
打印绑定变量。 print 是一个 SQL*Plus 命令。它是一部分
既不是 SQL 也不是 PL/SQL 语言。
SQL> print so
SO
--------------------------------
Hello World!