错误 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

PLS-00103:在 Oracle 11g 中遇到符号“DECLARE”

错误:00103 用于 plsql 过程

PLS-00103:遇到符号“;”预期以下情况之一时:

错误(30,11):PLS-00103:遇到符号更新错误

获取 PLS-00103:在创建包时遇到符号“/”错误