错误 PLS-00103:遇到符号“DECLARE”?
Posted
技术标签:
【中文标题】错误 PLS-00103:遇到符号“DECLARE”?【英文标题】:ERROR PLS-00103: Encountered the symbol “DECLARE”? 【发布时间】:2014-12-26 14:42:30 【问题描述】:我有下面的简单函数,我试图在其中使用动态查询的简单函数 即 sqlstatement(虽然在这个例子中我提到了简单的查询)
create or replace
FUNCTION test_simple_func ( testVal IN VARCHAR2)
RETURN number IS
total number(2) := 0;
DECLARE @sqlstatement VARCHAR(MAX);
BEGIN
SET @sqlstatement = 'Select * from employee';
select count(*) INTO total from employee;
RETURN total;
END;
我没搞错这里有什么问题?
【问题讨论】:
此代码不在Oracle
中,而在TSql
中。我已经发布了它的Oracle
版本,请查看。
【参考方案1】:
这里是 Oracle 版本:
CREATE OR REPLACE FUNCTION test_simple_func(
testVal IN VARCHAR2)
RETURN NUMBER
AS
total NUMBER;
sqlstatement VARCHAR2(4000);
BEGIN
sqlstatement := 'Select * from employee';
SELECT COUNT(*)
INTO total
FROM employee;
RETURN total;
END;
如果你想用作动态查询,那么你需要使用EXECUTE immediate
喜欢EXECUTE immediate sqlstatement
【讨论】:
【参考方案2】:与 varchar 限制为 4000 的 SQL 不同,PL/SQL 中的限制约为 32K
否则,不要在 PL/SQL 函数中声明。 DECLARE 用于 Oracle 中的匿名块。
正确的合成器是
CREATE OR REPLACE
FUNCTION test_simple_func ( testVal IN VARCHAR2)
RETURN number IS
total number(2) := 0;
sqlstatement VARCHAR(32000);
BEGIN
sqlstatement := 'Select * from employee';
select count(*) INTO total from employee;
RETURN total;
END;
【讨论】:
【参考方案3】:根据我的记忆,Oracle 不支持 VARCHAR(MAX)
【讨论】:
【参考方案4】:这是执行动态查询的正确方法
CREATE OR REPLACE FUNCTION test_simple_func(
testVal IN VARCHAR2)
RETURN NUMBER
IS
total NUMBER(10) := 0;
sqlstatement CLOB;
BEGIN
sqlstatement := 'Select count(*) from employee';
--select count(*) INTO total from employee;
EXECUTE immediate sqlstatement INTO total;
RETURN total;
END;
【讨论】:
【参考方案5】:declare
块应该在所有声明之前开始:
create or replace
FUNCTION test_simple_func ( testVal IN VARCHAR2)
RETURN number IS
DECLARE -- right place for declare
total number(2) := 0;
sqlstatement VARCHAR(4000);
BEGIN
SET sqlstatement = 'Select * from employee';
select count(*) INTO total from employee;
RETURN total;
END;
【讨论】:
仍然有问题。以下是完整的错误错误(4,2):PLS-00103:在预期以下情况之一时遇到符号“DECLARE”:begin function pragma procedure subtype type current cursor delete存在先前的外部语言符号“begin”被替换为“DECLARE”以继续。 错误(15,5):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:(begin case declare end exception exit for goto if loop mod null pragma raise return select update while with 第 4 行是“Declare..”,第 15 行是“END”以上是关于错误 PLS-00103:遇到符号“DECLARE”?的主要内容,如果未能解决你的问题,请参考以下文章
PLS-00103:尝试使用序列递增值时遇到符号 DECLARE/EOF