设为首页 收藏本站
查看: 631|回复: 0

[经验分享] ORACLE动态SQL笔记

[复制链接]

尚未签到

发表于 2016-7-21 10:24:08 | 显示全部楼层 |阅读模式
转:http://blog.iyunv.com/uid-20682026-id-3215006.html
 
 

declare
sql_statement varchar2(2000);
AMOUNT1 number;
bank varchar2(100):='101860001011700';
pi  number     :=2;
begin
sql_statement := 'select AMOUNT'||pi||' from YPY_BANKCOST_AGE_TEMP_ALL  where bank='||bank;
execute immediate sql_statement  into AMOUNT1;
dbms_output.put_line('数据' ||  AMOUNT1 || '的工资为' || AMOUNT1);
end;
create table CUX.YPY_BANKCOST_AGE_ALL
(
BATCH_IDNUMBER,
BANKVARCHAR2(150),
BANKDESCVARCHAR2(240),
AMOUNT1NUMBER,
AMOUNT2NUMBER,
AMOUNT3NUMBER,
AMOUNT4NUMBER,
AMOUNT5NUMBER,
AMOUNT6NUMBER,
AMOUNT7NUMBER,
AMOUNT8NUMBER,
AMOUNT9NUMBER,
AMOUNT10NUMBER,
SUMDEBITNUMBER,
TOTALMONNUMBER,
DATE_CREATE  DATE default sysdate ,
ATTRIBUTE_CATEGORY VARCHAR2(150),
ATTRIBUTE1         VARCHAR2(150),
ATTRIBUTE2         VARCHAR2(150),
ATTRIBUTE3         VARCHAR2(150),
ATTRIBUTE4         VARCHAR2(150),
ATTRIBUTE5         VARCHAR2(150),
ATTRIBUTE6         VARCHAR2(150),
ATTRIBUTE7         VARCHAR2(150),
ATTRIBUTE8         VARCHAR2(150),
ATTRIBUTE9         VARCHAR2(150),
ATTRIBUTE10        VARCHAR2(150),
ATTRIBUTE11        VARCHAR2(150),
ATTRIBUTE12        VARCHAR2(150),
ATTRIBUTE13        VARCHAR2(150),
ATTRIBUTE14        VARCHAR2(150),
ATTRIBUTE15        VARCHAR2(150),
CREATION_DATE      DATE default sysdate ,
CREATED_BY         NUMBER default -1,
LAST_UPDATE_DATE   DATE,
LAST_UPDATED_BY    NUMBER,
LAST_UPDATE_LOGIN  NUMBER
);

  我的表结构

DSC0000.png
 

 
下面的验证是在PL/SQL developer8 上面编写和验证。窗口为SQL WINDOWS;
1,使用execute immediate处理DDL操作
在PL/SQL处理DDL语句时,execute immediate后面只需要带有ddl语句文本即可,而不需要into和using子句:
example1:
create or replace procedure pro_drop_table(p_table_name varchar2) is
  sql_statement varchar2(100);
begin
  sql_statement := 'drop table ' || p_table_name;
  execute immediate sql_statement;
end;

表test2已经存在数据库中,验证如下:
begin
  pro_drop_table('test2');
  end;

2,使用execute immediate处理DCL操作
 在PL/SQL处理DDL语句时,execute immediate后面只需要带有dcl语句文本即可,而不需要into和using子句:
example2:

create or replace procedure pro_grant_sys_priv(p_priv     varchar2,
                                               p_username varchar2) is
  sql_statement varchar2(100);
begin
  sql_statement := 'grant ' || p_priv || ' to ' || p_username;
  execute immediate sql_statement;
end;

验证如下:
begin
  pro_grant_sys_priv('create session', 'scott');
end;

3,使用execute immediate处理DML操作
当使用execute immediate 处理dml语句时,如果dml语句没有占位符,也没有returning子句,那么在execute immediate
语句之后不需要带有using和returning into子句。
(1)处理无占位符和returning子句的DML语句

declare
  sql_statement varchar2(100);
begin
  sql_statement := 'update emp set sal = sal* 1.1 where deptno=30';
  execute immediate sql_statement;
end;

(2)处理包含占位符的DML语句
declare
  sql_statement varchar2(100);
begin
  sql_statement := 'update emp set sal = sal* (1+:percent/100) ' || ' where deptno=:dno'';
  execute immediate sql_statement using &1,&2;
  end;

 (3)处理包含RETURNING子句的DML语句
declare
  salary        number(6, 2);
  sql_statement varchar2(100);
begin
  sql_statement := 'update emp set sal = sal *(1+:percent/100)' ||  ' where empno = :eno  returning sal into :salary ';
  execute immediate sql_statement
    using &1, &2
    returning into salary;
  dbms_output.put_line('新工资:' || salary);
end;

4,使用execute immediate 处理单行查询
declare
  sql_statement varchar2(100);
  emp_record    emp%rowtype;
begin
  sql_statement := 'select * from emp where empno = :eno';
  execute immediate sql_statement
    into emp_record
    using &1;
  dbms_output.put_line('雇员 ' || emp_record.ename || '的工资为' ||
                       emp_record.sal);
end;

5,动态SQL处理多行查询语句,需要使用OPEN-FOR,FETCH和CLOSE 语句。
---定义游标变量---打开游标变量---循环游标变量---关闭游标变量
(1),定义游标变量语法
declare type cursor_name is ref cursor;
cursor_variable cursor_name;
(2),打开游标变量语法
OPEN cursor_variable for dynamic_string [USING bind_argument[,bin_argument]...];
--dynamic_string是动态的select语句,bind_argument用于指定存放传递给动态select语句值的变量。
(3),循环提取数据语法
FETCH cursor_variable INTO {var1[,var2]..|  record_var};
--var是用于接收提取结果的变量;record_var是用于接收提取结果的记录变量。
(4),关闭游标
CLOSE cursor_variable;
(5),查询示例:

  declare
    type emp_cur_type is ref cursor;
    emp_cur       emp_cur_type;
    emp_record    emp%rowtype;
    sql_statement varchar2(200);
  begin
    sql_statement := 'select * from emp where deptno = :dno';
    open emp_cur for sql_statement
      using &dno;
    loop
      fetch emp_cur
        into emp_record;
      exit when emp_cur%notfound;
      dbms_output.put_line('雇员名:' || emp_record.ename || ',工资' ||
                           emp_record.sal);
    end loop;
  end; 

6,在动态SQL语句中使用BULK子句,实际是动态SQL语句将变量绑定为集合元素。
集合类型可以是PL/SQL所支持的索引表,嵌套表和VARRY;当集合元素必须使用SQL数据类型(number,char等),
而不能使用PL/SQL数据类型(如binary_integer,boolean等);有三种支持BULK子句:EXECUTE IMMEDIATE,FETCH,
FORALL,下面分别介绍在这三种语句中使用BULK子句的方法。

(1)使用bulk子句处理DML语句返回子句
 declare
    type ename_table_type is table of emp.ename%type index by binary_integer;
    type sal_table_type is table of emp.sal%type index by binary_integer;
    ename_table   ename_table_type;
    sal_table     sal_table_type;
    sql_statement varchar2(200);
  begin
    sql_statement := 'update emp set sal = sal*(1+percent/100)' ||
                     ' where deptno=:dno' ||
                     ' returing ename,sal into :name,:salary';
    execute immediate sql_statement
      using &percent,&dno
      returning bulk collect
      into ename_table, sal_table;
    for i in 1..ename_table.count loop
      dbms_output.put_line('雇员' || ename_table(i) || '的新工资为' ||
                           sal_table(i));
    end loop;
  end;

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247274-1-1.html 上篇帖子: Oracle 外键查询和操作 下篇帖子: oracle_package\packeage body
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表