从程序调用表函数(pl sql)

时间:2015-02-16 07:44:26

标签: function plsql procedure

我在调用一个从我的程序返回一个表的函数时遇到了很大的麻烦。我相信我的声明有问题所以它没有编译。这是我的代码..开发人员用红色强调 SELECT“D_ID” from table“(IREL_FN(X))”; 。这是我的代码。

CREATE OR replace PROCEDURE Irrelevant_skata (x NUMBER)
AS
  d_id T_ID_TABLE;
BEGIN
  DECLARE
  TYPE yo_table
IS
  TABLE OF YO_TABLE;
  YO_TABLE "(IREL_FN (X))"%TYPE;
  id                 NUMBER;
BEGIN
  SELECT "D_ID"
  INTO   yo_table
  FROM   TABLE "(IREL_FN (X))";

EXCEPTION
WHEN no_data_found THEN
  dbms_output.Put_line('NO DATA FOUND');
END;
END irrelevant_skata;

功能

CREATE OR replace FUNCTION Irel_fn (x IN NUMBER)
RETURN T_ID_TABLE
AS
  id T_ID_TABLE;
BEGIN
    BEGIN
        SELECT Cast(MULTISET(SELECT "id"
                             FROM   "somethingcopy"
                             WHERE  "kati" IN (SELECT "auto"
                                               FROM   "ekeino"
                                               WHERE  "id" = x)) AS T_ID_TABLE)
        INTO   id
        FROM   dual;

        RETURN id;
    EXCEPTION
        WHEN no_data_found THEN
          dbms_output.Put_line('null');
    END;
END irel_fn; 

3 个答案:

答案 0 :(得分:1)

如果不知道你想要做什么,很难回答。

YO_TABLE "(IREL_FN (X))"%TYPE;

这没有任何意义。您不能将变量声明为函数的%type。抬头看着YO_TABLE声明,你写了

  DECLARE
  TYPE yo_table
IS
  TABLE OF YO_TABLE;

咦?表声明是您要声明的相同变量的表吗?


而且:

  SELECT "D_ID"
  INTO   yo_table
  FROM   TABLE "(IREL_FN (X))";

在投放表时,您不需要引号,IREL_FN(X)中的x是一个形式参数,您需要将其替换为您需要传递的实际值

答案 1 :(得分:0)

我正在回答您标记为重复的问题(精确获取的问题)。 我用以下方式重写了你的代码,希望它有所帮助。我使Irel_fn成为一个流水线函数,但是你仍然可以编写Cast multiset,但是你也需要使用类型构造函数。

create table auto(id number)

此表代替您的来源" AUTO" (所以我可以编译它。)

create or replace type t_id as object (id number);
/
Create or replace type t_id_table is table of t_id;
/
create or replace FUNCTION Irel_fn (x IN NUMBER) RETURN T_ID_TABLE PIPELINED
as
BEGIN
 for rec in (select id from auto where id=x)
loop
 Pipe row (t_id(rec.id));
end loop;
return;
end;  
/
create or replace procedure Irrelevant_skata (insid in NUMBER) is
bob t_id_table;
BEGIN      
  select t_id(id) bulk collect into bob from table(irel_fn(insid)); 
END;

答案 2 :(得分:0)

create or replace
PROCEDURE IRRELEVANT_SKATA (INSID IN NUMBER) AS ID T_ID_TABLE ;
BEGIN
      DECLARE
          YO_TABLE T_ID_TABLE;
      BEGIN
          select ID 
          into YO_TABLE
          from table(IREL_FN(INSID));
      EXCEPTION
          WHEN NO_DATA_FOUND THEN dbms_output.put_line('NO DATA FOUND');      
      END;
END IRRELEVANT_TWEET;



<-----------------------------FUNCTION---------------------------------->

create or replace
FUNCTION IREL_FN ( D_ID IN NUMBER ) RETURN T_ID_TABLE AS 
ID T_ID_TABLE;
BEGIN      
BEGIN
    SELECT CAST(
    MULTISET(
    SELECT "Id"
    FROM "SOMETHINGCOPY"
    WHERE "KATI" = (SELECT "EKEINO" FROM "AUTO" WHERE "Id"=D_ID)
    INTO ID
    FROM DUAL;
return ID;
EXCEPTION
  WHEN NO_DATA_FOUND THEN dbms_output.put_line('null');    
END;

END IREL_FN;

我希望我帮助过。)