使用过程

时间:2016-12-07 17:27:54

标签: oracle stored-procedures plsql

在一个包中,我有:

  1. 一种数字表
  2. 将所述数字表类型作为参数
  3. 的函数
  4. 需要使用数字表类型
  5. 调用所述函数的过程

    我知道Type工作,我知道函数有效。但是当我尝试在Procedure中调用Function时,我得到以下编译错误:

      

    错误(262,16):PLS-00306:调用中的参数数量或类型错误   到'[FUNCTION]'错误(262,16):PL / SQL:ORA-00904:   “[PACKAGE]”。“[FUNCTION]”:无效标识符错误(264,41):PLS-00642:   SQL语句中不允许使用本地集合类型

    包标题:

    CREATE OR REPLACE PACKAGE [PACKAGE] AS 
    
        TYPE NUMBER_LIST IS TABLE OF NUMBER;
    
        FUNCTION [FUNCTION] (
            [LIST_PARAM]       NUMBER_LIST
          ) RETURN VARCHAR2;
    
        PROCEDURE [PROCEDURE] (
            RECORDS_AFFECTED    OUT NUMBER
          );
    
    END [PACKAGE];
    

    问题代码:

      PROCEDURE [PROCEDURE](
          RECORDS_AFFECTED    OUT NUMBER
      )AS
          [ID_LIST]  NUMBER_LIST;
      BEGIN
          ...
    
          SELECT  [COLUMN]
          BULK COLLECT INTO    [ID_LIST]
          FROM    [TABLE]
    
          INSERT INTO [TABLE]( [COLUMN] )
          SELECT   [FUNCTION]( LIST_PARAM => [ID_LIST] )
          FROM    [OTHER TABLE];
    
          ...  
      END [PROCEDURE];
    

    错误围绕着这一行:

    SELECT   [FUNCTION]( LIST_PARAM => [ID_LIST] )
    

    我试过了:

    [ID_LIST]  NUMBER_LIST;
    [ID_LIST]  [PACKAGE].NUMBER_LIST;
    
    SELECT   [FUNCTION]( [ID_LIST] )
    SELECT   [FUNCTION]( LIST_PARAM => [ID_LIST] )
    SELECT   [PACKAGE].[FUNCTION]( [ID_LIST] )
    SELECT   [PACKAGE].[FUNCTION]( LIST_PARAM => [ID_LIST] )
    

    但我觉得问题在于[ID_LIST]的传递方式。

    对于我将错误的这个Type TABLE OF NUMBER参数传递给函数的任何想法?

1 个答案:

答案 0 :(得分:2)

问题不在于函数本身的参数列表,而是您尝试在SQL语句中使用本地定义的类型NUMBER_LIST(这是PLS的问题) -00642错误)。 SQL引擎对此类型一无所知。您必须为此创建一个数据库类型才能成功,例如:

CREATE OR REPLACE  TYPE NUMBER_LIST IS TABLE OF NUMBER;

或者类似的东西:

  PROCEDURE [PROCEDURE](
      RECORDS_AFFECTED    OUT NUMBER
  )AS
      [ID_LIST]  NUMBER_LIST;
      fnc_ret    VARCHAR2;
  BEGIN
      ...

      SELECT  [COLUMN]
      BULK COLLECT INTO    [ID_LIST]
      FROM    [TABLE]

      fnc_ret := [FUNCTION]( LIST_PARAM => [ID_LIST] );

      INSERT INTO [TABLE]( [COLUMN] )
      VALUES (fnc_ret);

      ...  
  END [PROCEDURE];

您可能需要修改此内容以适合您的实际代码,但这是个主意。你不能在SQL语句中使用ID_LIST而不使其成为数据库定义类型,因为SQL引擎无法看到它。

PL / SQL是一个"引擎"在RDBMS中。它有一个语句处理器,当遇到SQL语句时,它将它交给SQL"引擎"用于处理。我想你可以看出导致问题的原因。