生成动态SQL_insert update select 语句

快速生成insert update select 语句

declare

sText VARCHAR2(3000);

sTable varchar2(30);

begin

sTable := ‘&Tablename‘;

select get_sql_insert(sTable) INTO sText from dual;

DBMS_OUTPUT.put_line(sText);

DBMS_OUTPUT.put_line(‘‘);

DBMS_OUTPUT.put_line(‘‘);

select get_sql_Update(sTable) INTO sText from dual;

DBMS_OUTPUT.put_line(sText);

DBMS_OUTPUT.put_line(‘‘);

DBMS_OUTPUT.put_line(‘‘);

select get_sql_select(sTable) INTO sText from dual;

DBMS_OUTPUT.put_line(sText);

end;

/

CREATE OR REPLACE FUNCTION GET_SQL_INSERT(STABLENAME IN VARCHAR2) RETURN VARCHAR2 IS

/*

-- 用途 : 获取表全部字段的插入(INSERT)语句

*/

RESULT VARCHAR2(3000);

I INTEGER;

BEGIN

I:= 0;

RESULT := ‘INSERT INTO ‘|| UPPER(STABLENAME) ||‘(‘ ;

FOR CUR IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE UPPER(TABLE_NAME) = UPPER(STABLENAME) ORDER BY COLUMN_ID ) LOOP

IF I = 0 THEN

RESULT := RESULT || CUR.COLUMN_NAME;

ELSE

RESULT := RESULT ||‘,‘ ||CUR.COLUMN_NAME;

END IF;

I:= I+1;

END LOOP;

RESULT := RESULT || ‘ ) VALUES ( ‘;

I:= 0;

FOR CUR IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE UPPER(TABLE_NAME) = UPPER(STABLENAME) ORDER BY COLUMN_ID ) LOOP

IF I = 0 THEN

RESULT := RESULT ||‘:‘||CUR.COLUMN_NAME;

ELSE

RESULT := RESULT ||‘,:‘ ||CUR.COLUMN_NAME;

END IF;

I:= I+1;

END LOOP;

RESULT := RESULT || ‘ ) ‘;

RETURN(RESULT);

END GET_SQL_INSERT;

/

CREATE OR REPLACE FUNCTION GET_SQL_UPDATE(STABLENAME IN VARCHAR2)

RETURN VARCHAR2 IS

/*

-- 用途 : 获取表全部字段的更新(UPDATE)语句

*/

RESULT VARCHAR2(3000);

PK_COL VARCHAR2(30);

I INTEGER;

BEGIN

I := 0;

RESULT := ‘UPDATE ‘ || UPPER(STABLENAME) || ‘ SET ‘;

FOR CUR IN (SELECT COLUMN_NAME

FROM USER_TAB_COLS

WHERE UPPER(TABLE_NAME) = UPPER(STABLENAME)

ORDER BY COLUMN_ID) LOOP

IF I = 0 THEN

RESULT := RESULT || CUR.COLUMN_NAME || ‘= :‘ || CUR.COLUMN_NAME;

ELSE

RESULT := RESULT || ‘,‘ || CUR.COLUMN_NAME || ‘= :‘ ||

CUR.COLUMN_NAME;

END IF;

I := I + 1;

END LOOP;

RESULT := RESULT || ‘ WHERE ‘;

BEGIN

SELECT UL.COLUMN_NAME

INTO PK_COL

FROM USER_CONSTRAINTS UC, USER_CONS_COLUMNS UL

WHERE UC.CONSTRAINT_NAME = UL.CONSTRAINT_NAME

AND UC.TABLE_NAME = UPPER(STABLENAME)

AND CONSTRAINT_TYPE = ‘P‘;

EXCEPTION

WHEN OTHERS THEN

PK_COL := ‘‘;

END;

IF PK_COL IS NOT NULL THEN

RESULT := RESULT || PK_COL || ‘1 = :‘ || PK_COL || ‘1‘;

END IF;

RETURN(RESULT);

END GET_SQL_UPDATE;

/

CREATE OR REPLACE FUNCTION GET_SQL_SELECT(STABLENAME VARCHAR2,

OtherName VARCHAR2 default ‘‘) RETURN VARCHAR2 IS

/*

-- 用途 : 获取表全部字段的查询(SELECT)语句

*/

RESULT VARCHAR2(3000);

I INTEGER;

PreOtherName VARCHAR2(31);

BEGIN

I:= 0;

IF nvl(TRIM(otherName),‘ ‘) = ‘ ‘ THEN

PreOtherName := ‘‘;

ELSE

PreOtherName := TRIM(otherName) ||‘.‘;

END IF;

RESULT := ‘SELECT ‘;

FOR CUR IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE UPPER(TABLE_NAME) = UPPER(STABLENAME) ORDER BY COLUMN_ID ) LOOP

IF I = 0 THEN

RESULT := RESULT || PreOtherName||CUR.COLUMN_NAME;

ELSE

RESULT := RESULT ||‘,‘ ||PreOtherName||CUR.COLUMN_NAME;

END IF;

I:= I+1;

END LOOP;

RESULT := RESULT || ‘ FROM ‘|| UPPER(STABLENAME)||‘ ‘||TRIM(otherName);

RETURN(RESULT);

END GET_SQL_SELECT;

原文地址:https://www.cnblogs.com/xiaogaokui/p/8961024.html

时间: 2024-11-08 03:42:38

生成动态SQL_insert update select 语句的相关文章

【oracle】update select语句

原文地址:https://www.cnblogs.com/xiangtunmizu/p/11960689.html

SQL update select结合语句详解及应用

来源:http://www.aimks.com/sql-update-the-select-statement-application.html QL update select语句 最常用的update语法是: UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE 如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦 第一,要select出来放在临时变量上,有很多个很难

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

【MYSQL】update/delete/select语句中的子查询

update或delete语句里含有子查询时,子查询里的表不能在update或是delete语句中,如含有运行时会报错:但select语句里含有子查询时,子查询里的表可以在select语句中. 如:把总成绩小于100的学生名称修改为天才 select stu_id from score group by stu_id having sum(grade)<100; #查询总成绩小于100的学生IDupdate students set name='天才' where id in (select s

Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic-update 这两个注解在一定程度上可以增加与数据库操作相关的速度,可以节省SQL语句的执行时间,提高程序的运行效率. 使用这两个注解只需要在实体类上加入即可,或者在*.hbm.xml配置.这两个注解是boolean值,true或者false. 1.首先使用false来看一下执行的结果,我们就拿更新

【转载】SQL update select结合语句详解及应用

最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name1 = VALUE WHRER column_name2 = VALUE 如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦 第一,要select出来放在临时变量上,有很多个很难保存. 第二,再将变量进行赋值. 列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢? 就好象下面:: 1 2 3 INSERT INTO ta

探讨SELECT语句的元数据&amp;amp;动态取样&amp;amp;读一致性导致的一致性读和递归操作

前几天,论坛上的同行在讨论SELECT语句的元数据,动态取样和读一致性导致的一致性读和递归问题,今天有时间,就试着进行了测试,本人测试环境如下: win7_64+Oracle11.2.0.4_64 那么,下面就说下测试过程: 1.元数据:当用户向数据库发出SELECT语句后,在解析和执行过程中,肯定是需要读取SELECT相关的元数据,这样,SELECT的统计数据中就会包含递归操作,做这个测试的前提是要把其他因素排除掉(动态取样,一致性读): session1: session2: 由上可见,在表

SQL 基础:Select语句,各种join,union用法

一.基本的SELECT语句 1. “*”的注意事项:在SELECT语句中,用*来选取所有的列,这是一个应该抵制的习惯. 虽然节省了输入列名的时间,但是也意味着获得的数据比真正需要的数据多的多.相应的,也会降低应用程序的性能及网络性能. 良好的规则是只选所需. 2. join子句 join是用来定义如何从多个表中选取数据并组合成一个结果集. join必需是因为(1)我们所要获取的所有信息并不都在一个表中,或者(2)所要返回的信息都在一个表中,但是其上设置的条件信息却在另一个表中. join的共同点

sql中select语句详解及用途

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...] ] [ { UNION | INTERSECT | EXCEPT } [ ALL ] sel