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