jiezhi(西域浪子) :
请说说你用临时表的方法,可以给个例子吗?谢谢:)
请说说你用临时表的方法,可以给个例子吗?谢谢:)
解决方案 »
- oracle中的2个疑惑
- oracle怎么这么难啊??
- 在两台数据库服务之间共享数据,应该如何实现?(急!!!!)
- 运行SQLLDR工具是不是必须安装ORACLE?
- 调用write时参数数量或者类型错误
- 请问oracle中如何写一个过程从某个目录下的.txt文件中读入记录并插入某个表中,有什么专门的函数或包没有?
- 急!我在WIN2000 adserver(c4 1.7g ddr256m)上安装ORACLE8I为什么启动不了安装程序?
- 怎么用命令行来执行一个.SQL文件?
- 请教关于Select... Case...When 语句的写法示例.
- 游标报错 请大家帮忙看下
- 重分答谢解决此问题者
- linux 下的proc 编程问题(来鸟级)急
建立视图?这个我没试过,可以详细说说吗?:P
/*---------------------------------------
功能:出中国石油统计报表《全部员工分类情况》
编写:廖志强
日期:2002年7月18日
说明:该表为年报,只反映系统内的现状情况
---------------------------------------*/ CURSOR exist IS SELECT * FROM user_objects WHERE object_name='T_QBYGFLQK_CHINA_TEMP';
sql_str STRING(2000);
insert_str STRING(2000);
ExistOrNot user_objects%ROWTYPE;
--单位员工
v_dwyg CONSTANT STRING(150):='select count(*) from '||
'(select distinct ygid from t_yggzsx) gz,t_ygjbxx yg where gz.ygid=yg.ygid';
--签订合同的员工,合同在生效状态
v_dwyg_ht CONSTANT STRING(200):='select count(*) from '||
'(select distinct ygid from t_yggzsx) gz,t_ygjbxx yg,t_yght ht '||
' where gz.ygid=yg.ygid and yg.ygid=ht.ygid and htzt like ''%生效%''';
--内部退养的员工
v_dwyg_nt CONSTANT STRING(300):='select count(*) from '||
'(select distinct ygid from t_yggzsx) gz,t_ygjbxx yg,t_nbty nt '||
' where gz.ygid=yg.ygid and yg.ygid=nt.ygid';
begin
-- 判断临时表 T_QBYGFLQK_CHINA_TEMP 是否存在,如果存在,则删除该临时表
OPEN exist;
FETCH exist INTO ExistOrNot;
IF exist%FOUND THEN
EXECUTE IMMEDIATE 'drop table T_QBYGFLQK_CHINA_TEMP';
END IF;
CLOSE exist;
--创建表
sql_str:='create table T_QBYGFLQK_CHINA_TEMP(head varchar2(40),bh varchar2(10),';
FOR v_count IN 1..19 LOOP
sql_str:=sql_str||'f'||to_char(V_count)||' varchar(40),';
END LOOP;
sql_str:=rtrim(sql_str,',');
sql_str:=sql_str||') tablespace users';
EXECUTE IMMEDIATE sql_str;
--插入标识行
sql_str:='INSERT INTO T_QBYGFLQK_CHINA_TEMP(HEAD,BH,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,'||
'F13,F14,F15,F16,F17,F18,F19)'||
'VALUES'||
'(''甲'',''0'',''期末员工总数'',''长期员工'',''合同期为1-3年的员工数'','||
'''合同期为3-5年的员工数'',''合同期在5年以上的员工数'',''无固定期限的员工数'','||
'''临时员工数'',''在岗员工数合计'',''管理人员数'',''专业技术人员数'','||
'''操作服务人员小计数'',''操作人员数'',''服务人员数'',''在册不在岗员工数'','||
'''内部退养人员数'',''下岗人员数'',''待岗人员数'',''长期休假人员数'',''其他'')';
EXECUTE IMMEDIATE sql_str;
sql_str:='INSERT INTO T_QBYGFLQK_CHINA_TEMP(HEAD,BH)VALUES(''合计'',''1'')';
EXECUTE IMMEDIATE sql_str;
--更新数据
----------按用工期限
sql_str:='update T_QBYGFLQK_CHINA_TEMP '||
'set '||
'f1=('||v_dwyg||'),'||
'f2=('||v_dwyg_ht||' and (ht.htqx>=1 or htlx=''无固定期限'')),'||
'f3=('||v_dwyg_ht||' and ht.htqx>=1 and ht.htqx<3),'||
'f4=('||v_dwyg_ht||' and ht.htqx>=3 and ht.htqx<5),'||
'f5=('||v_dwyg_ht||' and ht.htqx>=5),'||
'f6=('||v_dwyg_ht||' and ht.htlx=''无固定期限''),'||
'f7=('||v_dwyg_ht||' and ht.htqx<1)'||
' where bh=''1''';
EXECUTE IMMEDIATE sql_str;
---------在岗员工
sql_str:='update T_QBYGFLQK_CHINA_TEMP '||
'set '||
'f8=('||v_dwyg||' and yg.zt=''在岗''),'||
'f9=('||v_dwyg||' and yg.zt=''在岗'' and yg.tsxbz=''管理人员''),'||
'f10=('||v_dwyg||' and yg.zt=''在岗'' and yg.tsxbz=''工程技术人员''),'||
'f11=('||v_dwyg||' and (yg.gwlb=''操作人员'' or yg.gwlb=''服务人员'')),'||
'f12=('||v_dwyg||' and yg.gwlb=''操作人员''),'||
'f13=('||v_dwyg||' and yg.gwlb=''服务人员'')'||
' where bh=''1''';
EXECUTE IMMEDIATE sql_str;
---------在册不在岗员工
sql_str:='update T_QBYGFLQK_CHINA_TEMP '||
'set '||
'f14=('||v_dwyg||' and yg.zt<>''在岗''),'||
'f15=('||v_dwyg_nt||'),'||
'f16=('||v_dwyg||' and yg.tsxbz=''下岗人员''),'||
'f17=('||v_dwyg||' and yg.tsxbz=''待岗人员''),'||
'f18=('||v_dwyg||' and yg.tsxbz=''长期病伤假人员'')'||
' where bh=''1''';
EXECUTE IMMEDIATE sql_str;
sql_str:='UPDATE T_QBYGFLQK_CHINA_TEMP '||
'SET '||
'f19=(SELECT (f14-f15-f16-f17-f18) FROM T_QBYGFLQK_CHINA_TEMP WHERE bh=''1'')'||
'WHERE bh=''1''';
EXECUTE IMMEDIATE sql_str;
COMMIT;
end SP_QBYGFLQK_CHINA;
这个是比较早的了,做法不好--容易产生碎片.你就看看做法吧。