2013-12-09 142 views
1

我有创建函数的问题。我会尽量解释一下是什么问题:pl/sql:在oracle中选择作为函数的参数/参数

的任务是创造一种基于select first_name from employees where dept_id=10;功能。新功能必须有v_select_statement(这是我写的)作为参数(某事像这样:v_select_statement := select first_name from employees where dept_id=10; Selet就像你可以看到生成的名称列表,这些名称应该是它在该函数创建过新表新表应具有名称,如。 。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 
; 

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

回答

0

这是您的referenec创建的函数。 我建议你什么事先,然后创建一个表尝试向其中插入数据。请尝试此代码,并让我知道它是否适用于您。谢谢

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; 
0

我不知道你的函数的目的是什么。但是,如果你仍然想尝试做这

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 
;` 
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事前,然后插入无动态SQL该表normalle。
你还必须记住,这个功能只能运行一次,因为这将导致一个错误,如果你尝试创建表时它已经存在。