【问题标题】:ERROR PLS-00103: Encountered the symbol “DECLARE”?错误 PLS-00103:遇到符号“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 版本,请查看。

标签: oracle function plsql


【解决方案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”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-05
          • 2018-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          相关资源
          最近更新 更多