`

oracle function执行dml语句的方法

 
阅读更多
create or replace function F_DEALWITH_LSBD(YDYF varchar2) return varchar2 is
    TYPE ref_type IS REF CURSOR;
    P_YDYF varchar2(8);--年度月份
    V_SQL_QUERY CLOB;--查询未返写的数据的sql
    V_NSRDZDAH varchar2(30);
    V_FKJG_BH varchar2(32);
    V_SQL_UPDATE CLOB;--返写更新sql
    cur ref_type;--动态游标
    pragma autonomous_transaction;
begin
    P_YDYF := YDYF;
    V_SQL_QUERY := 'select mx.nsrdzdah,nvl(k.fkjg_bh,'''') from LDMT04_LSBDDZ_HZ h,fxyd_rwmx mx,fxyd_ydjgfk k 
                           where h.dsnsrzhdah = mx.nsrdzdah
                           and mx.rwpc_bh is not null 
                           and mx.rwtczt_dm = ''YXF'' 
                           and mx.hxcl_dm = ''YDCZ'' 
                           and mx.xxly_dm = ''00'' 
                           and exists(select 1 from fxfx_smmx m,FXGL_FXSB_MXKZSX kz
                           where m.fxmx_bh = mx.fxxx_bh and kz.mx_dm = m.mxdm and kz.tsfx_lx = ''02'') 
                           and h.sfczcy is null 
                           and mx.fxxx_bh = k.fxxx_bh(+) 
                           and h.ydyf = '''||P_YDYF||'''';
    
    open cur for V_SQL_QUERY;
    FETCH cur into V_NSRDZDAH,V_FKJG_BH;
    while cur%FOUND LOOP
      
    if V_FKJG_BH='' THEN
       
      
       V_SQL_UPDATE:='update LDMT04_LSBDDZ_HZ set sfczcy=''Y'',sfycl=''N'' 
                      where dsnsrzhdah='''||V_NSRDZDAH||''' and ydyf='''||P_YDYF||'''';
    ELSE
       
       V_SQL_UPDATE:='update LDMT04_LSBDDZ_HZ set (sfczcy,sfycl,BJCJS,BJCJSZNJ,
                BJJYFFJ,BJJYFFJZNJ,BJDFJYFJ,BJDFJYFJZNJ,BJFK,CYYY,FKLRRY,FKRQ,BZ) = 
                          (select ''Y'',
                                  ''Y'',
                                  sum(decode(z.zsxm_dm,
                                                ''10109'',decode(z.zspm_dm,''101099900'',null,''101099901'',null,''101099961'',null,z.rksk),null)), 
                                  sum(decode(z.zsxm_dm,
                                                ''10109'',decode(z.zspm_dm,''101099900'',z.rksk,null),null)),
                                  sum(decode(z.zsxm_dm,
                                                ''10381'',decode(z.zspm_dm,''103819900'',null,''103819901'',null,''103819961'',null,z.rksk),null)),
                                  sum(decode(z.zsxm_dm,
                                                ''10381'',decode(z.zspm_dm,''103819900'',z.rksk,null),null)),
                                  sum(decode(z.zsxm_dm,
                                                ''10386'',decode(z.zspm_dm,''103869900'',null,''103869901'',null,z.rksk),null)),           
                                  sum(decode(z.zsxm_dm,''10386'',decode(z.zspm_dm,''103869900'',z.rksk,null),null)),
                                  sum(decode(z.zsxm_dm||''!''||z.zspm_dm,
                                                ''10109!101099901'',z.rksk,''10109!101099961'',z.rksk,
                                                ''10381!103819901'',z.rksk,''10109!103819961'',z.rksk, 
                                                ''10386!103869901'',z.rksk, null)),
                                  '''',
                                  max(k.YDCZRY_MC),
                                  to_char(max(k.FKSJ),''yyyy-mm-dd''), 
                                  ''''
                           from fxyd_ydjgfk_zs z, fxyd_ydjgfk k 
                           where k.fkjg_bh = z.fkjg_bh(+) 
                           and k.fkjg_bh = '''||V_FKJG_BH||'''
                           group by k.fkjg_bh)
                     where dsnsrzhdah='''||V_NSRDZDAH||''' and ydyf='''||P_YDYF||'''';
    END IF;
    --执行更新
    EXECUTE IMMEDIATE V_SQL_UPDATE;
    commit; 
    FETCH cur into V_NSRDZDAH,V_FKJG_BH;
    END LOOP;
    CLOSE cur;
    
    return '';
end;

 

 

pragma autonomous_transaction;是关键加了这个提供了一个自治事物就可以在执行function时执行dml语句了

select f_dealwith_lsbd('?') from dual;
分享到:
评论

相关推荐

    oracle中 procedure(存储过程)和function(函数)本质区别

    - 存储过程没有这个限制,它可以自由地包含DML语句,并且通常用于执行复杂的业务逻辑。 3. **调用方式**: - 函数可以直接在表达式中调用,如`x := func();`或`SELECT func() FROM dual;`,因为函数返回值可以...

    ORACLE plsal基础语句代码编写

    本文将深入探讨Oracle PL/SQL基础语句的编写,帮助你更好地理解和运用这一语言。 1. **变量声明**: 在PL/SQL中,我们首先需要声明变量来存储数据。变量的声明通常包括数据类型和变量名,如`DECLARE var_name ...

    针对oracle的SQL语句学习

    - `CREATE TRIGGER`:当特定的DML操作(INSERT,UPDATE,DELETE)发生时,自动执行的代码段,用于实现业务规则的自动应用。 11. **权限和角色**: - `GRANT`和`REVOKE`:用于授予和撤销用户对数据库对象的操作...

    Oracle常用SQL语句复习

    12. **触发器**:触发器是一种数据库对象,会在特定的DML事件(INSERT, UPDATE, DELETE)发生时自动执行。 13. **分区表**:对于大型表,可以使用分区技术提高查询性能,如范围分区、列表分区、哈希分区等。 14. *...

    Oracle面试题

    - 隐式游标则是由PL/SQL自动管理,通常在执行DML语句或返回单条记录的查询时使用。PL/SQL会自动打开、处理和关闭游标。 2. **Oracle与SQL Server的区别**: - 平台差异:Oracle可跨多个操作系统,而SQL Server...

    oracle上课学习笔记

    与DDL不同,执行DML语句后,必须显式执行COMMIT命令来提交事务。 3. 动态性能表:这些表在实例启动时创建,用于存储关于实例性能的信息,如连接信息、I/O统计、初始化参数值等。通过查询这些表,DBA可以监控和优化...

    常用SQL如何查看正在执行的语句

    ### 如何在Oracle中查看正在执行的SQL语句及锁信息 #### 一、查看当前锁定情况 在Oracle数据库管理中,了解当前存在的锁是非常重要的,可以帮助我们更好地诊断和解决问题。下面将详细介绍如何查看Oracle中的锁信息...

    oracle数据库开发规范.pdf

    2. Oracle的自动跟踪(autotrace)用于跟踪SQL语句的执行情况。 3. Oracle的SQL优化器(CBO)使用统计信息来选择最优的执行计划。 4. Oracle的行级锁定(row-level locking)用于保证并发事务的正确性。 5. ...

    oracle认证老师的oracle课件

    3. DML语句:了解INSERT、UPDATE、DELETE语句,用于添加、修改和删除数据。 4. 创建和修改表结构:学习CREATE TABLE、ALTER TABLE等语句,以创建新表或修改现有表的结构。 5. 视图:理解视图的概念,学习如何创建和...

    oracle数据库应用与开发讲义

    - 语句级触发器:在整个SQL语句执行前后触发。 - DDL触发器:在执行数据定义语言(DDL)操作时触发。 - **触发器管理**:使用ALTER TRIGGER语句启用、禁用触发器,使用DROP TRIGGER语句删除触发器。 #### 专题九...

    Oracle调优总结收藏.docx

    1. SQL 执行计划:了解 SQL 语句的执行计划,可以帮助我们更好地理解 SQL 语句的执行过程和优化方法。 2. SQL 调整:了解 SQL 调整的方法,可以帮助我们更好地提高查询性能。 3. 执行计划的稳定性:了解执行计划的...

    Oracle学习笔记

    与DDL不同,执行DML语句后,需要显式执行`COMMIT`命令来提交事务。 3. 动态性能表:这些表在实例启动时创建,用于存储关于实例性能的信息,如连接信息、I/O统计、初始化参数值等。 4. 存储过程(Procedure)与函数...

    Oracle数据库存储过程.pdf

    通过以上的介绍,我们可以了解到Oracle存储过程的定义、使用方法、变量的定义与声明、游标的使用、循环控制语句、过程控制语句、存储过程的创建和异常处理、触发器的概念与使用、JOB的管理以及SQL优化策略等多个方面...

    oracle中的经常用到的包

    13. **LAST_SQL_FUNCTION_CODE**:返回最后一次执行的SQL语句的功能代码。 在提供的示例中,创建了一个名为dml_sql的存储过程,它演示了如何使用DBMS_SQL来动态执行一个SQL查询。过程接收一个参数,然后构造一个...

    oracle语法

    CREATE PROCEDURE语句用于创建存储过程,而CREATE FUNCTION创建用户自定义函数。它们可以提高代码重用性,提升性能,并提供业务逻辑封装。 6. 事务处理: 事务是数据库操作的逻辑单位,具有ACID属性(原子性、一致...

    oracle笔记二--plsql 编程.txt

    当使用`EXECUTE IMMEDIATE`执行DML语句时,可以通过`USING`子句传递绑定变量。 - **示例**: ```sql DECLARE l_dept_name VARCHAR2(20) := 'Testing'; l_loc VARCHAR2(10) := 'Dubai'; BEGIN EXECUTE ...

    oracle SQL语法大全

    最后,Oracle SQL还支持存储过程和函数,它们是预编译的SQL和PL/SQL代码块,可以重复使用并执行复杂的业务逻辑。DECLARE, BEGIN, END关键字用于定义PL/SQL块,PROCEDURE和FUNCTION分别用于创建过程和函数。 总的来...

    Oracle9i中JAVA和PL_SQL的互操作方法.pdf

    4. 调用JAVA存储过程:一旦JAVA存储过程被发布,就可以在SQL语言的DML语句、PL/SQL块或PL/SQL子程序中调用它。调用的方法与调用其他PL/SQL存储过程相同,可以通过SQL的CALL语句在SQLPlus或数据库触发器中进行调用。 ...

    oracle资源大全

    文档可能涵盖了CREATE PROCEDURE、CREATE FUNCTION、BEGIN/END语句块、参数声明、异常处理等基础语法。 4. **oracle 存储过程代码.sql**:这个文件可能包含实际的存储过程示例代码,读者可以通过这些实例理解存储...

    oraclesql参考手册

    3. 数据操纵:Oracle SQL的DML(数据操纵语言)包括`INSERT`、`UPDATE`和`DELETE`命令,用于添加、修改和删除数据。此外,`MERGE`语句是Oracle特有的,它结合了插入和更新的功能,对数据进行条件操作。 4. 视图:...

Global site tag (gtag.js) - Google Analytics