pl/sql:在oracle中选择作为函数的参数/参数

Posted

技术标签:

【中文标题】pl/sql:在oracle中选择作为函数的参数/参数【英文标题】:pl/sql: select as argument/parameter of function in oracle 【发布时间】:2013-12-09 00:22:06 【问题描述】:

我在创建函数时遇到了问题。我将尝试解释问题所在:

任务是关于创建基于select first_name from employees where dept_id=10; 的函数。新函数必须有 v_select_statement(我写的)作为参数(像这样:v_select_statement := select first_name from employees where dept_id=10;。像你可以看到生成名称列表一样选择。这些名称也应该在这个函数中创建的新表中。新表应该有名称,例如 new_table。 问题是我不知道该怎么做。我试过这样的事情:

create or replace

FUNCTION create_new_tab (v_select_statement VARCHAR2) RETURN NUMBER
is
b first_name.employees%TYPE;

begin

--here i don`t know how to assign select statement to cursor or execute immediate. Any ideas? i tried create sth like:
-- execute immediate 'v_select_statement into b ';


execute immediate 'CREATE TABLE new_tab (i VARCHAR2(50))';
execute immediate 'insert into new_tab values (statement_result)';
--don`t know how and what to put as statement_result. I know that i could use cursor, but ---how in this case?
return 1;

exception
when others then
dbms_output.put_line(SQLERRM);
return 0;

END create_new_tab
;

你能帮帮我吗,因为我放弃了。我不知道如何解决这个问题。 如果可以,请帮助我。

【问题讨论】:

【参考方案1】:

您可以执行以下操作:

create or replace FUNCTION create_new_tab (v_select_statement VARCHAR2) RETURN NUMBER
is
b employees.first_name%TYPE;
cur SYS_REFCURSOR;

begin
OPEN cur for v_select_statement;

execute immediate 'CREATE TABLE new_tab (i VARCHAR2(50))';

LOOP
    FETCH cur into b;
    EXIT WHEN cur%NOTFOUND;
    execute immediate 'insert into new_tab values (:statement_result)' USING b;
END LOOP;
CLOSE cur;
return 1;

exception
when others then
dbms_output.put_line(SQLERRM);
return 0;

END create_new_tab
;

没有表格就无法对其进行测试,但它可能会为您指明正确的方向。 但正如 Avrajit 已经说过的,我建议事先创建 new_tab,然后在没有 Dynamic-SQL 的情况下正常插入该表。 您还必须记住,此函数只能运行一次,因为如果您在表已经存在时尝试创建它会导致错误。

【讨论】:

【参考方案2】:

这是为您的推荐人创建的函数。 我建议你先创建一个表,然后 尝试将数据插入其中。请试试这个代码,让我 知道它是否适合你。谢谢

Create or replace function test_func return number
as
cursor cr is select name from avrajit 
where department='.NET';
name_av avrajit.name%type;
begin
for rec in cr
loop
insert into av_test(dpt) values(rec.name);
return 1;
end loop;
exception 
when others then
return 0;
end test_func;

【讨论】:

【参考方案3】:

我不知道你的功能的目的是什么。但是如果你还想试试这个

create or replace

FUNCTION create_new_tab (v_select_statement VARCHAR2) RETURN NUMBER
is
b first_name.employees%TYPE;

begin

--here i don`t know how to assign select statement to cursor or execute immediate. Any ideas? i tried create sth like:
-- execute immediate 'v_select_statement into b ';


execute immediate 'CREATE TABLE new_tab (i VARCHAR2(50))';
execute immediate 'insert into new_tab values ( ' ||  v_select_statement || ' )';    --don`t know how and what to put as statement_result. I know that i could use cursor, but ---how in this case?
return 1;

exception
when others then
dbms_output.put_line(SQLERRM);
return 0;

END create_new_tab
;`

【讨论】:

以上是关于pl/sql:在oracle中选择作为函数的参数/参数的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL - 作为表名的函数参数 - 这怎么可能?

如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数

带有参数的 PL/SQL 过程/函数从选择查询返回表

oracle pl/sql 将异常类型传递给函数

Oracle PL/SQL 中基于参数的选择查询

带输入参数的 Oracle PL/SQL 函数