解决方案 »
- oracle 10g 10.1.0.2.0版本的数据库怎么恢复到10.2.0.1的数据库上?
- oracle 和sqlserver数据类型
- -- 严重鄙视那些无证程序员...... --
- oracle数据库表导出问题(100分)
- oracle触发器请教,一次删除多个关联表中的数据
- 昨天已经跳过楼了,今天还得去么?oracle连接问题,请大家赐教!
- SQL查询语句问题,高手指教
- 怎样将所有的查询结果组合成一个字符串?
- 可以帮我看看这个sql语句么????
- 在线等候,急!!!--如何写程序把一个TXT文本的数据导入到ORACLE数据库相应的表中呢?
- oracle 利用PL/SQL 实现分页
- A、B两个字段,哪个存在就取哪个,都存在取A,用什么函数
CREATE OR REPLACE FUNCTION F_TEST RETURN VARCHAR2 AS V_SQL VARCHAR2(4000);
V_CONDITION VARCHAR2(1000);
V_PARAM VARCHAR2(2000);
CURSOR_NAME NUMBER;
ROWS_PROCESSED NUMBER;
AREA_CODE NUMBER;
RESULT VARCHAR2(4000);BEGIN
V_SQL := 'SELECT t.area_code FROM S_AREA_INFO t where 1=1 ';
V_CONDITION := ' and area_code like :a';
V_PARAM := '52%';
CURSOR_NAME := DBMS_SQL.OPEN_CURSOR; --打开游标
DBMS_SQL.PARSE(CURSOR_NAME, V_SQL || V_CONDITION, DBMS_SQL.NATIVE); --解析动态SQL语句
DBMS_SQL.BIND_VARIABLE(CURSOR_NAME, ':a', V_PARAM); --绑定输入参数
DBMS_SQL.DEFINE_COLUMN(CURSOR_NAME, 1, AREA_CODE); --定义列
ROWS_PROCESSED := DBMS_SQL.EXECUTE(CURSOR_NAME); --执行动态SQL语句
LOOP
EXIT WHEN DBMS_SQL.FETCH_ROWS(CURSOR_NAME) <= 0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
DBMS_SQL.COLUMN_VALUE(CURSOR_NAME, 1, AREA_CODE); --将当前行的查询结果写入上面定义的列中
RESULT := RESULT || AREA_CODE || ',';
END LOOP;
DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME); --关闭游标 RETURN(RESULT);
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(CURSOR_NAME) THEN
DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
END IF;
RETURN 'error';
END F_TEST;
定义一个变量v_sql,然后v_sql:='一堆sql语句'||wherestr||'一堆sql语句'
拼完sql以后再写一行 execute immediate v_sql
数据量大的话最好使用过程返回游标
...
is
eng sys_refcursor;
...
begin
result:='';
wherestr:='where t.process_status!3';
case
when(adt_type=1) then
open eng for 'select t.prod_reg_no from t_exchange t '||wherestr;
loop
fetch eng into...;
exit when eng%notfound;
end loop;
end case;
...
wherestr:='where t.process_status!=3'
这整个条件会变,还是说process_status 的值会变
如果是整个条件会变,可以用Execute Immediate,和记录集
如果只是值会变,最简单用Cursor就可以了啊
Create or Replace function fun_prodRegNo(adt_type number)
return varchar2 is
l_result Varchar2(1000);
l_para varchar2(2);
cursor c1(l_para VARCHAR2) is
select t.prod_reg_no
FROM t_exchange_cancle t
WHERE t.process_status != l_para;
Begin
l_para := 3;--给变量赋值
....
for eng in c1(l_para) loop end loop;
...
End;