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中选择作为函数的参数/参数的主要内容,如果未能解决你的问题,请参考以下文章