【问题标题】:Calling table function from procedure (pl sql)从过程调用表函数(pl sql)
【发布时间】:2015-02-16 07:44:26
【问题描述】:

我在调用从我的过程中返回一个表的函数时遇到了很大的麻烦。我相信我的声明有问题,所以它没有编译。这是我的代码.. 开发人员用红色下划线 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; 

【问题讨论】:

  • bob "(IREL_FN (X))"%TYPE;TABLE "(IREL_FN (X))"; 声明/使用不正确。
  • 你能告诉我正确的方法吗?
  • @Sathya 我真的需要答案,我的朋友.. 我的老板在逼迫我.. 请帮忙

标签: function plsql procedure


【解决方案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是形参,需要将其替换为需要传递的实际值

【讨论】:

  • 将 Yo_TABLE 声明为 T_ID_TABLE ID 号; BEGIN select * into YO_TABLE from table(IREL_FN(X));现在我有了这样的..又没有编译..我只想简单地从过程中调用表函数
  • 就像我说的,你打电话给IREL_FN(X))。 X 是一个形式参数,而不是一个实际参数。您需要将“x”的值替换为您需要传递的值
  • 在这一步之前..函数没有返回一个表..而是一个单一的值..我没有任何问题从过程中调用函数并且编译很好..没有任何问题X .. 既然函数返回表,我应该为 X 写更多或不同的东西吗?
  • 那个例子没有使用-调用函数到一个过程中。问题出在我的程序而不是我的函数中
  • 它已编译.. 感谢您抽出时间 Sathya!这是X!你是对的!!! :D :D
【解决方案2】:
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;

希望能帮到你:)

【讨论】:

  • 你是最正确的..虽然我已经做了.. :) 谢谢关心
【解决方案3】:

我正在回答您标记为重复的问题(精确提取的问题)。 我按照以下方式重写了您的代码,希望对您有所帮助。我让 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;

【讨论】:

  • 真的谢谢你,米娜。我昨天用另一种方式做到了。但你的解决方案很有教育意义。我会把它记在我的笔记里。再次......谢谢你!
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多