作为标题,我正在Oracle上编写一些存储过程,首先我检查了版本
SELECT * FROM v$version;
有结果
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
...
并尝试NVL2与常规SQL查询
select 'Test: ' || nvl2('...', 'things', 'nothing') from dual;
select 'Test: ' || nvl2('', 'things', 'nothing') from dual;
结果似乎是对的
Test: things
Test: nothing
...
所以我确认11g确实支持NLV2功能,我现在可以开始编写我的存储过程,如下所示:
create or replace procedure my_schema.SP_READ_MEMBER(noP in varchar2, nameP in varchar2, idNoP in varchar2, birthdayP in varchar2, resultP out sys_refcursor)
is
v_prg_name varchar2(20) := 'SP_READ_MEMBER';
sys_sql varchar2(1000);
begin
Insertlog(SYSDATE, v_prg_name, '1.0 Start');
sys_sql := sys_sql || 'select a.no, a.name, a.id_no, to_char(a.birthday, ''yyyy/MM/dd'') as birthday, ''REGISTERED'' as type, email, mobile from rep where 1=1 ';
sys_sql := sys_sql || nvl2(noP,'and no='''|| noP ||'''', ''); --PLS-00201
open resultP for sys_sql;
Insertlog(SYSDATE, v_prg_name, '2.0 Finished w/o error');
exception
when others then
declare
error_time VARCHAR2(30) := RTRIM(TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS'));
error_code NUMBER := SQLCODE;
error_msg VARCHAR2(300) := SQLERRM;
begin
rollback;
DBMS_OUTPUT.PUT_LINE(error_time || ',' || TO_CHAR(error_code) || ',' || error_msg);
Insertlog(SYSDATE, v_prg_name, error_msg || ', 3.0 ERROR, sql:' || sys_sql);
end;
end;
/
Oracle告诉我它编译有错误,即
PLS-00201:必须声明标识符“NVL2”
为什么函数在常规查询中工作,但在存储过程中变得未声明?
NVL2可以在SQL中工作,但不能在PL/SQL中工作。
改变:
sys_sql := sys_sql || nvl2(noP,'and no='''|| noP ||'''', '');
收件人:
select sys_sql || nvl2(noP,'and no='''|| noP ||'''', '') into sys_sql from dual;
除非您使用的是21c或更高版本,否则NVL2可以在SQL中工作,但不能在PL/SQL中工作。
并不是每个SQL关键字都能在PL/SQL中工作,这很愚蠢,但以前已经发生过几次了。Oracle一直在逐步统一SQL和PL/SQL,很可能他们最终会实现这个功能。目前,我认为我的Oracle支持文档《注释359506.1 Pls-00201将NVL2()的结果赋给PLSQL块中的变量》中已经涵盖了这个问题。尽管该文档不可用,甚至对具有支持访问权限的人员也不可用。
目前,我建议使用不同的语法。就我个人而言,我发现案例更清晰,即使它有点冗长。
改变:
sys_sql := sys_sql || nvl2(noP,'and no='''|| noP ||'''', '');
收件人:
sys_sql := sys_sql || case when nop is not null then 'and no='''|| noP ||'''' else '' end;
我正在使用SODA for Java存储和检索Oracle12c DB中的文档。我正在效仿这个例子。 这一例外背后的原因将是什么?
这是我的程序:
所以我一直有这个错误,我不知道发生了什么。我在谷歌上搜索了一下,读了一些关于这个错误的问题,但什么都没用。我只想运行它,这样我就可以完成我的项目。 错误:开始低库存;结束;*第1行错误:ORA-06550:第1行,第9列:PLS-00201:标识符“LOWINVENTORY”必须声明ORA-06550:第1行,第7列:PL/SQL:忽略语句 编辑: 表创建:
为什么会出现这个错误?如果变量声明与列的类型相同,则不应该这样做。nursing_unit_id是varchar2(10)。当ID是NUMBER时,它对我来说是这样工作的; 我得到的错误:错误报告-ORA-06550:第13行,第13列:PLS-00201:必须声明标识符“ISS”
安装在CentOS 8上。 已尝试两者 Oracle Database Express Edition (XE) 企业版 从这里 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html ords.warhttps://www.oracle.com/database/technologi
错误消息: [Microsoft][ODBC驱动程序for Oracle][Oracle]ORA-06550:第1行,第7列:PLS-00201:标识符STORED_PROCEDURE必须声明ORA-06550:第1行,第7列:PL/SQL:语句被忽略