表名是动态传进去的,请问可以建这样的function吗?
function参数为表名,ID和字段名;
里面利用这个表名拼一个SQL语句取出该字段的值用游标执行将结果fetch出来返回。
function中的SQL串是不是不能拼表名和字段,只能拼字段的值?大家能不能帮帮我,应该怎么弄,万分感谢!!!
function参数为表名,ID和字段名;
里面利用这个表名拼一个SQL语句取出该字段的值用游标执行将结果fetch出来返回。
function中的SQL串是不是不能拼表名和字段,只能拼字段的值?大家能不能帮帮我,应该怎么弄,万分感谢!!!
id in number,
v_col in varchar2)
return varchar2
is
v varchar2(2000);
begin execute immediate 'select '||v_col||' from '||v_table||' where id = '||id into v;
return v;
end fun;
/
你是的动态SQL,是不是指 ref cursor
编译的时候没问题,但是执行的时候说这一行
execute immediate 'select '||v_col||' from '||v_table||' where id = '||id into v;
无效的SQL语句。是怎么回事啊
嗯,试了我把function改成返回这个拼的SQL语句,然后拿到PL/SQL里能执行有结果不报错
SQL>
SQL> create or replace function fun(v_table in varchar2,
2 id in number,
3 v_col in varchar2)
4 return varchar2
5 is
6 v varchar2(2000);
7
8 begin
9
10 execute immediate 'select '||v_col||' from '||v_table||' where id = '||id into v;
11 return v;
12 end fun;
13 /Function createdSQL> create table a(id number, name varchar2(20));Table createdSQL> insert into a values(10,'xxx');1 row insertedSQL>
SQL> declare
2 v varchar2(20);
3 begin
4 v:= fun('a',10,'name');
5 dbms_output.put_line(v);
6 end;
7 /xxxPL/SQL procedure successfully completedSQL> 返回多列需要用ref cursor
CREATE OR REPLACE FUNCTION process_node_info (
table_id IN NUMBER,
record_id IN NUMBER
) RETURN NVARCHAR2 AS
table_name NVARCHAR2(50);--表名
--doc_type NVARCHAR2(30);--状态(先不管)
doc_no NVARCHAR2(30);--文档号(先返回这个)
sql_str NVARCHAR2(300);
BEGIN
--ad_table里记录了表的信息,这里取得表名
EXECUTE IMMEDIATE 'SELECT t.tablename FROM ad_table t where t.ad_table_id='||table_id INTO table_name;
--sql_str := 'SELECT documentno FROM '||table_name||' where '||table_name||'_id ='||record_id;
--根据表名和ID去到得documentno的值。我传进来的表里面肯定有这个字段。
--我的表的ID取名规则都是“表名_ID”
EXECUTE IMMEDIATE 'SELECT documentno FROM'||table_name||'where'||table_name||'_id='||record_id into doc_no;
return doc_no;END process_node_info;我测试的时候说第二个EXECUTE IMMEDIATE 无效的SQL语句。
execute immediate sql_str into doc_no;用这种方式单步调试
注意使用动态sql语句的时候,空格问题是错误高发问题
这一句:execute immediate sql_str into doc_no;
焦点在 sql_str ,说表达式类型错误。
table_id IN NUMBER,
record_id IN NUMBER
) RETURN NVARCHAR2 AS
table_name NVARCHAR2(50);--表名
--doc_type NVARCHAR2(30);--状态(先不管)
doc_no VARCHAR2(30);--文档号(先返回这个)
v_sql varchar2(2000);
BEGIN
dbms_output.put_line('SELECT t.tablename FROM ad_table t where t.ad_table_id='||table_id);
EXECUTE IMMEDIATE 'SELECT t.tablename FROM ad_table t where t.ad_table_id='||table_id INTO table_name;
--sql_str := 'SELECT documentno FROM '||table_name||' where '||table_name||'_id ='||record_id;
v_sql := 'SELECT documentno FROM '||table_name||' where '||table_name||'_id ='||record_id;
dbms_output.put_line(v_sql);
EXECUTE IMMEDIATE v_sql into doc_no;
return doc_no; END process_node_info;
/
SQL>
SQL> declare
2 v NVARCHAR2(50);
3 begin
4 v := process_node_info(4,1);
5 dbms_output.put_line(v);
6 end;
7 /SELECT t.tablename FROM ad_table t where t.ad_table_id=4
SELECT documentno FROM a where aid =1
xxxxxxxxxxPL/SQL procedure successfully completed
剩下的我自己搞定!