Oracle 存储过程
我想做一个这样的存储过程,用游标的形式返回结果集,一般的游标反回结果集我会,我现在的问题是:
我传进来的参数正好是存储过程里SQL的条件名,在where后面的三个必要条件都是传进来的参数,如这样的
select intareaid,strareacode,strareaname
from base_area
where ZDName(传进来的) =(条件运算符传进来) qing(条件结果也是传进来的)
请教高手在oracle实现这一功能呢?先谢谢你们啦!
不会的,也帮我顶一下!!!
谢谢各位
问题点数:20、回复次数:9Top
1 楼baojianjun(包子)回复于 2005-04-19 15:33:16 得分 20
使用動態SQL語句就可以解決了
...............
sqltxt:= 'select intareaid,strareacode,strareaname into is_a,is_b,is_c where ';
sqltxt:= sqltxt||'zdname'||'condition'||'''qing''' ';
execute immediate sqltxt ;
..............Top
2 楼baojianjun(包子)回复于 2005-04-19 15:37:46 得分 0
不好意思 修改一下
sqltxt:= 'select intareaid,strareacode,strareaname into is_a,is_b,is_c ';
sqltxt:= sqltxt||' where '||zdname||condition||'''qing''' ;
execute immediate sqltxt ;
Top
3 楼SZJAVA(chen)回复于 2005-04-19 15:46:27 得分 0
谢谢 baojianjun(包子) ,但你这样返回的结果只是一条记录,但要实现返回一个结果集怎么办呢?
我现在做的是定义一个包,用游标的形式返回。Top
4 楼baojianjun(包子)回复于 2005-04-19 16:01:44 得分 0
使用一個臨時表吧
create or replace table xxxx_temp(a [type],b [type], c [type]);
sqltxt:= 'insert into xxxx_temp (a,b,c) select intareaid,strareacode,strareaname ';
sqltxt:= sqltxt||' where '||zdname||condition||'''qing''' ;
execute immediate sqltxt ;
Top
5 楼SZJAVA(chen)回复于 2005-04-19 16:20:53 得分 0
谢谢,但是不行,你能不能给一个例子给我呢?谢谢!!
Top
6 楼baojianjun(包子)回复于 2005-04-19 16:40:51 得分 0
--example
--我的一個 存儲過程中的一段代碼
CREATE OR REPLACE PROCEDURE CM_PRO_EACH_LAYER
(
VAR_MON IN VARCHAR2
)
AS
.............
begin
..........................
EXECUTE IMMEDIATE 'SET TRANSACTION USE ROLLBACK SEGMENT RB2';
OPEN CUR_LAYER;
LOOP
FETCH CUR_LAYER INTO IS_LAYER;
EXIT WHEN CUR_LAYER%NOTFOUND;
IS_DETAIL := 'DETAIL_'||IS_LAYER||'L';
ERROR_:='非基板、委外、成型的原物料,制造費用,直接人工計算出錯!';
SQLTXT := 'UPDATE CM_EACH_LAYER_DETAIL A ';
SQLTXT := SQLTXT||' SET A.'||IS_DETAIL||'= ( ';
SQLTXT := SQLTXT||' SELECT SUM(B.TOTAL_USE_AMOUNT) ';
SQLTXT := SQLTXT||' FROM CM_PART_ST_MATERIAL_COST_SAVED B ';
SQLTXT := SQLTXT||' WHERE B.MON_DATE= '''||VAR_MON||''' ';
SQLTXT := SQLTXT||' AND B.ST_ID NOT IN (''RT'') ';
SQLTXT := SQLTXT||' AND B.COST_CODE NOT IN (''JB00'',''WGCOST'') ';
SQLTXT1 := ' AND SUBSTR(B.PART_ID,4,1)='''||IS_LAYER||''' ';
SQLTXT1 := SQLTXT1||' AND B.ST_ID=A.ST_ID ';
SQLTXT1 := SQLTXT1||' AND B.TYPE=A.COST_TYPE ) ';
SQLTXT1 := SQLTXT1||' WHERE A.MON_DATE='''||VAR_MON||''' ';
SQLTXT1 := SQLTXT1||' AND A.ST_ID NOT IN (''JB_CT'',''WG_CT'',''RT'') ';
SQLTXT1 := SQLTXT1||' AND A.COST_TYPE IN (''原物料'',''制造費用'',''直接人工'') ';
EXECUTE IMMEDIATE SQLTXT||SQLTXT1;
ERROR_:='沖型的原物料,制造費用,直接人工計算出錯!';
SQLTXT := 'UPDATE CM_EACH_LAYER_DETAIL A ';
SQLTXT := SQLTXT||' SET A.'||IS_DETAIL||'= ( ';
SQLTXT := SQLTXT||' SELECT SUM(B.TOTAL_USE_AMOUNT) ';
SQLTXT := SQLTXT||' FROM CM_PART_ST_MATERIAL_COST_SAVED B ';
SQLTXT := SQLTXT||' WHERE B.MON_DATE = '''||VAR_MON||''' ';
SQLTXT := SQLTXT||' AND B.ST_ID = ''RT'' ';
SQLTXT := SQLTXT||' AND B.COST_DES LIKE ''%沖型%'' ';
SQLTXT1 := ' AND SUBSTR(B.PART_ID,4,1)='''||IS_LAYER||''' ';
SQLTXT1 := SQLTXT1||' AND B.TYPE=A.COST_TYPE ) ';
SQLTXT1 := SQLTXT1||' WHERE A.MON_DATE='''||VAR_MON||''' ';
SQLTXT1 := SQLTXT1||' AND A.COST_CENTER = ''A34'' ';
SQLTXT1 := SQLTXT1||' AND A.COST_TYPE IN (''原物料'',''制造費用'',''直接人工'') ';
EXECUTE IMMEDIATE SQLTXT||SQLTXT1;
ERROR_:='計算表面處理和成型方式綜合數據出錯';
OPEN CUR_SUR;
LOOP
FETCH CUR_SUR INTO IS_SUR;
EXIT WHEN CUR_SUR%NOTFOUND;
--求得去處本身所剩下的表面處理站別
IS_SURFACE := SUBSTR(IS_SUR,1,INSTR(IS_SUR,'+')-1);
ALL_SURFACE := '''HA'''||','||'''EG'''||','||'''GP'''||','||'''SF''' ;
IS_POS := INSTR(ALL_SURFACE,IS_SURFACE);
IS_LEN := LENGTH(ALL_SURFACE);
IS_ST := SUBSTR(ALL_SURFACE,1,IS_POS-1)||SUBSTR(ALL_SURFACE,IS_POS+5,IS_LEN);
IS_ST := SUBSTR(IS_ST,1,IS_LEN-5);
--記錄相反的成型方式
SELECT DECODE(SUBSTR(IS_SUR,INSTR(IS_SUR,'+')+1,LENGTH(IS_SUR)),'CUT','成型沖型','成型切型')
INTO IS_FLAG FROM DUAL ;
SQLTXT := 'UPDATE CM_EACH_LAYER_DETAIL A SET A.'||IS_DETAIL||' = ( ';
SQLTXT := SQLTXT||' SELECT SUM(B.'||IS_DETAIL||') ';
SQLTXT := SQLTXT||' FROM CM_EACH_LAYER_DETAIL B ';
SQLTXT := SQLTXT||' WHERE B.MON_DATE = '''||VAR_MON||''' ';
SQLTXT := SQLTXT||' AND B.COST_TYPE = ''單位成本'' ';
SQLTXT := SQLTXT||' AND B.DES <> '''||IS_FLAG||''' ';
SQLTXT := SQLTXT||' AND INSTR(B.COST_CENTER,''+'') = 0 ';
SQLTXT := SQLTXT||' AND B.ST_ID NOT IN ('||IS_ST||') ) ';
SQLTXT := SQLTXT||' WHERE A.MON_DATE = '''||VAR_MON||''' ';
SQLTXT := SQLTXT||' AND A.COST_CENTER = '''||IS_SUR||''' ';
EXECUTE IMMEDIATE SQLTXT;
END LOOP;
CLOSE CUR_SUR;
END LOOP;
CLOSE CUR_LAYER;
..............................................Top
7 楼SZJAVA(chen)回复于 2005-04-19 16:57:53 得分 0
谢了,自己动手做一做吧!谢谢啦!!到时结贴时,不会忘了你!嘿嘿Top
8 楼SZJAVA(chen)回复于 2005-04-20 15:27:40 得分 0
在存储过程中加入临时表,生成动态的SQL语句,把结果插入到临时表里,再用游标取回结果是可以,但复杂一点的SQL组就麻烦了,在SQL里加几个自己写的函数,那就更难处理动态SQL语句了,不知哪一位兄台有更好一点的处理方法?
我现在的情况是这样的
在一张报表里,按一定的条件查询出结果,我又要在结果里查询,其中的查询条件是这样的
被查的字段名下拉框里选,操作符也是从下拉框里选,(>,<,=,<>,like),选定二项后,就在文本框里写结果,如 (日期=2005-01-01),日期和=分别是从二个下拉框里选中的,其中日期是报表的一个项.
有哪一位兄台有好的方法处理我的第二次查询,申明一点,我第一次查询也是写存储过程的形式实现的,而且存储过程中调用了八个自己写的函数,所以说报表比较复杂!
Top
9 楼SZJAVA(chen)回复于 2005-04-20 15:29:54 得分 0
来者帮我顶一下,谢谢各位关注!分值不够可以另开贴!
Top




