根据客户需要,我们增加了一个统计表,用来汇总统计数据,统计数据的产生,需要根据一个基本表,动态执行sql语句.在存储过程中,动态生成sql语句然后执行,需要用到Execute Immediate命令.我想写一个通用的统计用存储过程,似乎不大好办,if语句的应用在所难免了.呵呵.
特此存档.
create or replace procedure P_INSERT_XT_TJ_MX(sDate in varchar2) is
--author:李春雷
--create time:2005.8.4
--purpose:更新xt_tj_mx表
sXh xt_tj.xh%type; --主表序号
sDwmc xt_tj.dwmc%type;
sDw xt_tj.dw%type;
sDwzd xt_tj.dwzd%type;
sTable xt_tj.hzbmc%type;
sSjzd xt_tj.sjzd%type;
sSqlStr varchar2(300);
iCount int;
cursor curSort is
select xh,dwmc,hzbmc,sjzd,dwzd,dw from xt_tj ;
begin
open curSort;
loop
fetch curSort into sXh,sDwmc,sTable,sSjzd,sDwzd,sDw;
exit when curSort%notfound;
sSqlStr := 'select count(*) from '|| sTable || ' where to_char('||sSjzd||','||'''YYYYMM'')=:sDate and '||sDwzd ||
' in (select dwxh from xt_dw connect by prior dwxh = dwfxh start with dwxh =:sDw)';
Execute Immediate sSqlStr into iCount using sDate,sDw;
delete from xt_tj_mx where fxh=sXh and sjz=sDate;
insert into xt_tj_mx(xh,fxh,hzsm,sjz)values(SEQ_XT_TJ_MX.NEXTVAL,sXh,iCount,sDate);
commit;
end loop;
end P_INSERT_XT_TJ_MX;
今天增加了一个统计项目,用到了动态游标,存档.
create or replace procedure P_INSERT_XT_TJ_MX(sDate in varchar2) is
--author:李春雷
--create time:2005.8.8
--purpose:更新xt_tj_mx表
sXh xt_tj.xh%type; --主表序号
sDwmc xt_tj.dwmc%type;
sDw xt_tj.dw%type;
sDwzd xt_tj.dwzd%type;
sTable xt_tj.hzbmc%type;
sSjzd xt_tj.sjzd%type;
sSqlStr varchar2(300);
iCount int;
iTemp int;
sYear varchar2(4);
sQxflbh qx_qxjl.qxflbh%type;
cursor curSort is
select xh,dwmc,hzbmc,sjzd,dwzd,dw from xt_tj ;
type t_Cursor is REF CURSOR;
qxCursor t_Cursor;
begin
dbms_output.put_line(sDate);
sYear:=substr(sDate,1,4);
open curSort;
loop
fetch curSort into sXh,sDwmc,sTable,sSjzd,sDwzd,sDw;
exit when curSort%notfound;
--统计各公司工作任务单数目:
if sTable = 'rw_gzrwd' then
sSqlStr := 'select count(*) from '|| sTable || ' where to_char('||sSjzd||','||'''YYYYMM'')=:sDate and '||sDwzd ||
' in (select dwxh from xt_dw connect by prior dwxh = dwfxh start with dwxh =:sDw)';
Execute Immediate sSqlStr into iCount using sDate,sDw;
delete from xt_tj_rw_gzrwd where fxh=sXh and sjz=sDate;
insert into xt_tj_rw_gzrwd(xh,fxh,hzsm,sjz)values(SEQ_XT_TJ_MX.NEXTVAL,sXh,iCount,sDate);
end if;
--统计各公司各缺陷数目
if sTable = 'qx_qxjl' then
sSqlStr := 'select count(*),t.qxflbh from ' || sTable ||
' t where qxdjrdw in (select dwxh from xt_dw connect by prior dwxh = dwfxh start with dwxh =:sDw) and to_char(t.fxrq,''YYYY'')=:sYear group by t.qxflbh';
open qxCursor for sSqlStr using sDw,sYear;
loop
fetch qxCursor into iCount,sQxflbh;
exit when qxCursor%notfound;
dbms_output.put_line('dwbh='||sDw||'flbh='||sQxflbh||',iCount='||iCount);
select count(*) into iTemp from xt_tj_qx_qxjl t where t.dwxh=sDw and t.qxflbh=sQxflbh and t.sjz=sYear;
if iTemp=0 then
insert into xt_tj_qx_qxjl(XH,DWXH,QXFLBH,SJZ,HZSM)values(seq_xt_tj_qx_qxjl.nextval,sDw,sQxflbh,sYear,iCount);
else
update xt_tj_qx_qxjl set hzsm=iCount where dwxh=sDw and qxflbh=sQxflbh and sjz=sYear;
end if;
end loop;
close qxCursor;
end if;
end loop;
close curSort;
commit;
end P_INSERT_XT_TJ_MX;
分享到:
相关推荐
通过以上两个示例可以看出,在Oracle存储过程中实现动态SQL语句的关键在于利用`EXECUTE IMMEDIATE`动态执行SQL语句以及通过创建包的方式来实现更为复杂的动态数据处理逻辑。这两种方法不仅提高了代码的灵活性,还...
总之,动态SQL中的EXECUTE IMMEDIATE是Oracle数据库开发中的重要工具,它提供了在运行时构建和执行SQL语句的能力,极大地扩展了PL/SQL的灵活性。但在使用过程中,应谨慎对待SQL注入风险,并确保遵循最佳实践,以提高...
在Oracle数据库中,`EXECUTE IMMEDIATE`是一个非常强大的特性,允许在运行时动态执行SQL语句或PL/SQL块。这一功能自Oracle 8i版本的DBMS_SQL包引入以来,极大地增强了PL/SQL的灵活性和动态性。通过`EXECUTE ...
这种格式使用 EXECUTE IMMEDIATE 语句,可以执行没有输入参数并且没有返回结果集的 SQL 语句。例如,创建一张数据库表、插入一条记录等。 EXECUTE IMMEDIATE ‘CREATE TABLE base(code char(6),name char(30))’ ...
批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...
Oracle 动态 SQL 中的 EXECUTE IMMEDIATE 语句是数据库中执行动态 SQL 语句或非运行时创建的 PL/SQL 块的重要工具。与 DBMS_SQL package 相比,EXECUTE IMMEDIATE 使用较简单,能够满足较常用的需要。 EXECUTE ...
在上面的示例中,我们创建了一个名为 create_table 的存储过程,该过程接受两个参数,table_name 和 columns,然后使用 execute immediate 语句来执行动态 SQL 语句,创建一个名为 t1 的表,包含 id 和 name 两个列...
- 有输入参数,有返回结果集,且返回结果集在编译时可以确定:通过定义带参数的SQL语句并声明动态游标,然后将动态SQL语句存储到动态数据移动区,最后提供参数并执行动态游标来处理数据。 - 有输入参数,有返回结果...
它可以用来执行没有输入参数并且设有返回结果集的SQL语句,同时也可以调用不带参数的存储过程。 语法:EXECUTE IMMEDIATE SQLStatement [USING TransactionObject] ; 例如: EXECUTE IMMEDIATE 'CREATE TABLE ...
动态SQL是在运行时构建和执行的SQL语句,通常用于处理不确定的查询结构或在程序逻辑中生成SQL。这在需要根据用户输入或其他变量来改变查询条件时非常有用。 - 在大多数数据库系统中,动态SQL可以通过字符串拼接和...
Execute Immediate 是 Oracle 中的一个功能强大且灵活的语句,它可以解析并马上执行动态的 SQL 语句或非运行时创建的 PL/SQL 块。 Execute Immediate 的目标是减小企业费用并获得较高的性能,较之以前它相当易于编码...
**EXECUTE IMMEDIATE**是另一种动态执行SQL语句的方式,它可以直接在PL/SQL块中执行任何有效的SQL语句。 #### 示例3:执行DDL语句 ```sql execute immediate 'DROP TABLE tab_temp'; ``` 这条语句直接在PL/SQL...
在某些情况下,需要建立一个包含动态属性的数据库表,其各属性在程序执行过程中动态产生或变化。这种情况下,使用动态SQL语句通过字符串变量构建SQL语句,并通过 EXECUTE IMMEDIATE 语句执行。如文章所示,SQL语句...
它将SQL语句作为一个字符串传递给 EXECUTE IMMEDIATE 语句。该类型的动态SQL语句的语法通常为: ``` EXECUTE IMMEDIATE SQLStatement {USING TransactionObject}; ``` 实例中展示了如何使用动态SQL创建一个名为...
在SQL(Structured Query Language...总结,动态SQL语句是SQL语言中的一个重要工具,它为处理复杂、变化的查询需求提供了便利。然而,使用时需要注意性能、安全性和代码可维护性等问题,确保合理、高效地运用这一特性。
PowerBuilder本身提供了一个名字为SQLSA的DynamicstagingArea类型的全局变量,用于保存要执行的动态SQL语句信息。 应用实例: * 删除base表中的满足一定条件的记录。 STRING lsCode lsCode=” 320101” PREPARE ...
PowerBuilder 动态SQL语句应用分析 PowerBuilder 是目前最流行的开发工具之一,广泛应用于各个行业,包括银行、证券、保险等金融行业。PowerBuilder 提供了动态 SQL 语句的功能来支撑对数据库的访问。但是,传统的...
在这种格式中,首先使用`PREPARE`声明一个动态存储区(DynamicStagingArea),然后用`EXECUTE`执行。`PREPARE`语句用于准备SQL语句,可以包含参数,如示例中的`Emp_id_var`。这在处理多次执行相同但参数不同的SQL...
1. EXECUTE IMMEDIATE不会提交一个DML事务执行,因此需要显式提交。 2. EXECUTE IMMEDIATE不支持返回多行的查询,可以使用临时表来存储记录或使用REF游标。 3. 在执行SQL语句时,不要用分号,在执行PL/SQL块时,在其...
在 PL/SQL 中,可以使用 `EXECUTE IMMEDIATE` 语句来执行动态 SQL。 #### 二、动态 SQL 的执行方式 动态 SQL 在 Oracle 中有两种常见的执行方式: 1. **使用 EXECUTE IMMEDIATE:** - **DDL(数据定义语言)操作...