Oracle Rowid, execute immediate

1.通过Rowid是最快的方式来访问一个列

Rowid的类型是Rowid或URowid,但它不是实际储存在数据库中的,所以你不能update,
  delete,insert rowid

当你在某些情况下重新插入或删除数据时,Rowid是会变化的,所以它是不可靠的,不应用它作为
  主键或者其他什么操作

1)rowid不是用来唯一标识表中的列的。它是用来唯一标识表中的数据行(即记录)。
2)rowid的值是全库唯一的,是由:表空间标识+文件标识+对象标识+行标识 四部分组成的。

https://blog.csdn.net/tss139/article/details/80197673

2.execute immediate, 

在存储过程中,如果创建表之后,向表中插入数据,那么在编译存储过程时,表还么有创建,因此会出现编译错误,在insert语句前加上execute immediate的语句后编译时就不会检查表是否存在了直接insert

count(*),会把星号翻译成字段的名字,计算分组下重复的行数。

https://www.cnblogs.com/zj0208/p/6088097.html

create or replace procedure proc_test(
--参数区域
)
is 
--变量区域
    --sql脚本
    v_sql varchar2(2000) :='';
    --记录学生数量
    v_num number;
begin
--执行区域

    -- execute immediate用法1:立刻执行sql语句
    v_sql := 'create or replace view myview as select id,name from student';
    execute immediate v_sql;
    
    --- execute immediate用法2:立刻执行sql语句,并赋值给某个变量
    v_sql := 'select count(1) from student';
    execute immediate v_sql into v_num;
    
    -- execute immediate用法3:带参数的sql
    v_sql:='select * from student t where t.name=:1 and t.age=:2'; 
    execute immediate v_sql using 'ZhangSan',23;
位置参数(我给起的名字),第一个参数:1 第二个参数:2
: 取变量值
    
end proc_test;

  EXECUTE IMMEDIATE 'SELECT ROWID' || CHR (10) ||
                                  '  FROM ' || rec_del.OBJECT_NAME || CHR (10) ||
                                  ' WHERE ' || rec_del.CONDITION  || CHR (10) ||
                                  '   AND ROWNUM < :1 '
                    BULK COLLECT INTO BV_STG_TAB
                    USING n_chunksize;

这里的:1 取的就是USING 后面的第一个参数的值n_chunksize;

  EXECUTE IMMEDIATE 'DELETE FROM ' || rec_del.OBJECT_NAME || CHR (10) ||
                                      ' WHERE ROWID = :1'
                        USING BV_STG_TAB(i);

这里的:1 取的是usring 后面第一个参数BV_STG_TAB(i) 的值。

猜你喜欢

转载自blog.csdn.net/hushunhuadao/article/details/82013857