精华内容
下载资源
问答
  • 动态执行sql语句

    千次阅读 2009-12-26 19:09:00
    execute immediate 语法后面跟上sql语句可以动态执行sql语句.使用场景:(1)加入动态表.比如你有一张表的名字不明确,是需要判断得到的,则可以使用该语法来生成sql语句.(2)加入动态字段.你根据判断,最终会加入同一张表,...

    execute immediate 语法

    后面跟上sql语句可以动态执行sql语句.

    使用场景:

    (1)加入动态表.比如你有一张表的名字不明确,是需要判断得到的,则可以使用该语法来生成sql语句.

    (2)加入动态字段.你根据判断,最终会加入同一张表,但是这张表根据不同的判断字段会有所不同,此时如果直接写sql是加不进去的,必须使用动态sql语句,让oracle编译时不判断字段是否与表匹配,这样的话才能动态加入字段.

    例:

    execute immediate 'insert into po_p_downloaddesc_' || table_languages(1) || '( contentid ) values(''' || s_contentid || ''')';

     

    PS:要注意的地方.

    (1)加入字段时,生成以后的sql语句要与非动态sql语句一模一样,也就是说,如果sql语句中有''的,那么在动态中也必须拼接''.

    例如:

    静态sql:insert into page values('123');

    动态sql:execute immediate 'insert into page values('  ''123'' )';

    中间俩个''123''最后生成'123'.语静态一样才可以插入,不然报错.

     

    复合表类型如果是建一个类型的话

    create or replace type type_table is table of varchar2(100);

    那么在存储过程或函数或程序块中调用时必须初始化.

    declare

      table_languages type_table := type_table();

    begin

      table_languages.extend(2);

      --上面为复合表table_languages申明了2个空间,这样只有1和2可以用,3的话就会抛出越界

    end;

     

    展开全文
  • Oracle使用EXECUTE IMMEDIATE命令动态执行SQL语句 动态执行SQL语句指先把一个SQL命令保存到一个字符串中,然后通过execute immediate命令动态执行字符串中的SQL语句,以实现SQL语句的动态生成。 一、动态SQL语句的...

    Oracle使用EXECUTE IMMEDIATE命令动态执行SQL语句

    动态执行SQL语句指先把一个SQL命令保存到一个字符串中,然后通过execute immediate命令动态执行字符串中的SQL语句,以实现SQL语句的动态生成。

    一、动态SQL语句的使用方式

    DECLARE
        字符串变量名 varchar2(n);        --定义一个字符串类型的变量,用以保存SQL语句
    BEGIN
        字符串变量名:=SQL命令;            --把SQL命令保存到字符串变量中
        EXECUTE IMMEDIATE 字符串变量名
            using 绑定参数列表 
            returning into 输出参数列表;;  --执行字符串中的SQL语句
    END;
    /
    

    说明:
    (1)EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交。
    (2)如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交,如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据;
    (3)不支持返回多行的查询,这种交互可以用临时表来存储记录或者使用动态游标REF cursors;
    (4)当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号。

    二、动态调用SQL语句举例

    1、通过动态SQL执行DDL语句

    创建一个存储过程sp_create_table,调用该存储过程创建一张数据表,代码如下:

    SQL> 
    create or replace procedure sp_create_table
    as
        v_table_name varchar2(100);
        v_sql_str varchar2(500);
    begin
        select 't'||to_char(sysdate,'yyyymmddhh24miss') 
            into v_table_name 
            from dual;
        v_sql_str:='create table '||v_table_name||'('||'
            id number(4) primary key,
            name varchar2(50),
            phone varchar2(20),
            addr varchar2(200)'||
            ')';
        execute immediate v_sql_str;
    end;
     17  /
    
    Procedure created.
    

    调用该存储过程,并查看结果:

    SQL> call sp_create_table();
    
    Call completed.
    
    SQL> select * from tab where tname like 'T2020%';
    
    TNAME			       TABTYPE	CLUSTERID
    ------------------------------ ------- ----------
    T20200217205344 	       TABLE
    T20200217205804 	       TABLE
    

    查看表结构:

    SQL> desc T20200217205804;
     Name														   Null?    Type
    -------------------------------- -------- ------------------------------------------------
     ID														   NOT NULL NUMBER(4)
     NAME															    VARCHAR2(50)
     PHONE															    VARCHAR2(20)
     ADDR															    VARCHAR2(200)
    

    2、创建一个动态查询,根据输入的参数查询某个雇员的信息

    存储过程的参数为雇员编号,根据传入的雇员编号查询该雇员的姓名和工资,代码如下:

    SQL> 
    create or replace procedure sp_get_emp
    (v_empno number)
    as
        v_ename varchar2(20);
        v_sal number(6);
        v_str varchar2(100);
    begin
        v_str:='select ename,sal from emp where empno=:1';
        execute immediate v_str into v_ename,v_sal using v_empno;
        dbms_output.put_line('姓名:'||v_ename||',工资:'||v_sal);
    exception
        when no_data_found then
            dbms_output.put_line('没有此雇员!');
    end;
     15  /
    
    Procedure created.
    

    执行该存储过程:

    SQL> call sp_get_emp(2222);
    没有此雇员!
    
    Call completed.
    
    Elapsed: 00:00:00.01
    SQL> call sp_get_emp(7788);
    姓名:SCOTT,工资:3011
    
    Call completed.
    
    展开全文
  • MySQL数据库-条件语句、循环语句、动态执行SQL语句   1、if条件语句 delimiter \\ CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT 1; ELSEIF i = 2 THEN SE

    MySQL数据库-条件语句、循环语句、动态执行SQL语句

     

    1、if条件语句

    复制代码
    delimiter \\
    CREATE PROCEDURE proc_if ()
    BEGIN
        
        declare i int default 0;
        if i = 1 THEN
            SELECT 1;
        ELSEIF i = 2 THEN
            SELECT 2;
        ELSE
            SELECT 7;
        END IF;
    
    END\\
    delimiter ;
    复制代码

     

     

     

    2、循环语句

    while循环

    复制代码
    delimiter \\
    CREATE PROCEDURE proc_while ()
    BEGIN
    
        DECLARE num INT ;
        SET num = 0 ;
        WHILE num < 10 DO
            SELECT
                num ;
            SET num = num + 1 ;
        END WHILE ;
    
    END\\
    delimiter ;
    复制代码

    repeat循环

    复制代码
    delimiter \\
    CREATE PROCEDURE proc_repeat ()
    BEGIN
    
        DECLARE i INT ;
        SET i = 0 ;
        repeat
            select i;
            set i = i + 1;
            until i >= 5
        end repeat;
    
    END\\
    delimiter ;
    复制代码

    loop循环

    iterate loop_label退出循环

    复制代码
    BEGIN
        
        declare i int default 0;
        loop_label: loop
            
            set i=i+1;
            if i<8 then
                iterate loop_label;
            end if;
            if i>=10 then
                leave loop_label;
            end if;
            select i;
        end loop loop_label;
    
    END
    复制代码

     

     

    3、动态执行SQL语句

    动态执行SQL语句,也就是执行一个存储过程来动态执行SQL语句

    举例:有这样一张表

     

     

    写一个存储过程无参,获取表里id大于11的数据

    PREPARE prod FROM存储过程里将字符串解析为sql语句执行,后面跟字符串类型的sql语句

    EXECUTE prod USING替换sql语句中的占位符,后面跟要替换占位符的、占位符变量,(sql语句中的占位符是?号)

     

    复制代码
    delimiter $$
    DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除
    CREATE PROCEDURE proc_sql () -- 创建proc_sql存储过程
    BEGIN
        declare p1 int;  -- 设置p1变量
        set p1 = 11;     -- 赋值p1变量等于11
        set @p1 = p1;    -- 赋值字符串占位符变量等于p1
    
        PREPARE prod FROM 'select * from tb2 where nid > ?';  -- 解析字符串为sql语句
        EXECUTE prod USING @p1;   -- 执行sql语句,并且用占位符变量替换sql语句中的?号
        DEALLOCATE prepare prod;  -- 释放解析和执行sql语句
    
    END $$
    delimiter ;
    复制代码

    执行存储过程,动态执行sql语句

    CALL proc_sql();  -- 执行存储过程,动态执行sql语句

     

     

    写一个存储过程有参,动态传参获取数据

    复制代码
    delimiter $$
    DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除
    CREATE PROCEDURE proc_sql (          -- 创建proc_sql存储过程
        in zfchsql CHAR(90),       --  zfchsql接收字符串最大90字符,接收sql语句
        in shuzi INT(20)           --  shuzi接收整数类型,最大20字符,接收一个id数
    ) 
    BEGIN
            -- 因为解析字符串为sql语句,和替换sql语句的占位符,需要用户变量,也就是有@的变量,所以需要重新赋值成用户变量
            SET @zfchsql = zfchsql;
            SET @shuzi = shuzi;
    
        PREPARE prod FROM @zfchsql;  -- 将接收到的字符串解析为sql语句
        EXECUTE prod USING @shuzi;   -- 将接收到的整数,替换sql语句中的?号占位符
        DEALLOCATE prepare prod;  -- 释放解析和执行的sql语句
    
    END $$
    delimiter ;
    复制代码

    传入参数动态执行sql语句

    CALL proc_sql('select * from usr where id > ?',5);  -- 传入参数动态执行sql语句

     

     

    重点:动态执行sql语句,可以防止sql注入,

    CALL proc_sql('select * from usr -- where id > ?',5);  -- 传入参数动态执行sql语句

    展开全文
  • MySQL数据库-条件语句、循环语句、动态执行SQL语句   1、if条件语句 delimiter \\ CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT 1; ELSEIF i = 2 THEN SELECT 2; .....

    MySQL数据库-条件语句、循环语句、动态执行SQL语句

     

    1、if条件语句

    delimiter \\
    CREATE PROCEDURE proc_if ()
    BEGIN
        
        declare i int default 0;
        if i = 1 THEN
            SELECT 1;
        ELSEIF i = 2 THEN
            SELECT 2;
        ELSE
            SELECT 7;
        END IF;
    
    END\\
    delimiter ;

     

     

     

    2、循环语句

    while循环

    delimiter \\
    CREATE PROCEDURE proc_while ()
    BEGIN
    
        DECLARE num INT ;
        SET num = 0 ;
        WHILE num < 10 DO
            SELECT
                num ;
            SET num = num + 1 ;
        END WHILE ;
    
    END\\
    delimiter ;

    repeat循环

    delimiter \\
    CREATE PROCEDURE proc_repeat ()
    BEGIN
    
        DECLARE i INT ;
        SET i = 0 ;
        repeat
            select i;
            set i = i + 1;
            until i >= 5
        end repeat;
    
    END\\
    delimiter ;

    loop循环

    iterate loop_label退出循环

    BEGIN
        
        declare i int default 0;
        loop_label: loop
            
            set i=i+1;
            if i<8 then
                iterate loop_label;
            end if;
            if i>=10 then
                leave loop_label;
            end if;
            select i;
        end loop loop_label;
    
    END

     

     

    3、动态执行SQL语句

    动态执行SQL语句,也就是执行一个存储过程来动态执行SQL语句

    举例:有这样一张表

     

     

    写一个存储过程无参,获取表里id大于11的数据

    PREPARE prod FROM存储过程里将字符串解析为sql语句执行,后面跟字符串类型的sql语句

    EXECUTE prod USING替换sql语句中的占位符,后面跟要替换占位符的、占位符变量,(sql语句中的占位符是?号)

     

    delimiter $$
    DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除
    CREATE PROCEDURE proc_sql () -- 创建proc_sql存储过程
    BEGIN
        declare p1 int;  -- 设置p1变量
        set p1 = 11;     -- 赋值p1变量等于11
        set @p1 = p1;    -- 赋值字符串占位符变量等于p1
    
        PREPARE prod FROM 'select * from tb2 where nid > ?';  -- 解析字符串为sql语句
        EXECUTE prod USING @p1;   -- 执行sql语句,并且用占位符变量替换sql语句中的?号
        DEALLOCATE prepare prod;  -- 释放解析和执行sql语句
    
    END $$
    delimiter ;

    执行存储过程,动态执行sql语句

    CALL proc_sql();  -- 执行存储过程,动态执行sql语句

     

     

    写一个存储过程有参,动态传参获取数据

    delimiter $$
    DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除
    CREATE PROCEDURE proc_sql (          -- 创建proc_sql存储过程
        in zfchsql CHAR(90),       --  zfchsql接收字符串最大90字符,接收sql语句
        in shuzi INT(20)           --  shuzi接收整数类型,最大20字符,接收一个id数
    ) 
    BEGIN
            -- 因为解析字符串为sql语句,和替换sql语句的占位符,需要用户变量,也就是有@的变量,所以需要重新赋值成用户变量
            SET @zfchsql = zfchsql;
            SET @shuzi = shuzi;
    
        PREPARE prod FROM @zfchsql;  -- 将接收到的字符串解析为sql语句
        EXECUTE prod USING @shuzi;   -- 将接收到的整数,替换sql语句中的?号占位符
        DEALLOCATE prepare prod;  -- 释放解析和执行的sql语句
    
    END $$
    delimiter ;

    传入参数动态执行sql语句

    CALL proc_sql('select * from usr where id > ?',5);  -- 传入参数动态执行sql语句

     

     

    重点:动态执行sql语句,可以防止sql注入,

    CALL proc_sql('select * from usr -- where id > ?',5);  -- 传入参数动态执行sql语句

     

    展开全文
  • 有些特殊原因,我们需要在SQL语句或者存储过程中动态创建SQL语句,然后在SQL语句或存储过程中动态执行。这里,微软提供了两个方法,一个是使用Execute函数执行方式为Execute(@sql)来动态执行一个SQL语句,但是这里...
  • Postgresql 函数中如何动态执行sql语句

    千次阅读 2019-08-20 09:30:16
    实现功能,根据传入id删除多张表的数据: CREATE or replace FUNCTION fn_delete ( p_deleteid INT ) RETURNS VARCHAR LANGUAGE 'plpgsql' AS $$ DECLARE sql1 VARCHAR ( 100 ); sql2 VARCHAR ( 100 );...sql4...
  • sp_executesql语法 sp_executesql [@stmt =] stmt[ {, [@params =] N@parameter_name data_type [,...n] } {, [@param1 =] value1 [,...n] }]参数[@stmt =] stmt包含 Transact-SQL 语句或批处理的 Uni
  • #输入用户名查询记录 不输入用户名为全查询 DELIMITER// DROP PROCEDURE IF EXISTS userinfoByParamter// CREATE PROCEDURE userinfoByParamter ( userName VARCHAR(50)) ... DECLARE stmt VARCHAR(2000);...
  • SQL的方法不好,因为有安全的风险,容易造成SQL的语法错误甚至SQL注入攻击。安全的方法是将%加入到参数中: --查询图书表中与查询关键字匹配的书籍信息ALTER PROCEDURE [dbo].[SP_SelectByKeywordProc]( @Keyword...
  • exec(selectIDENTITY(int,1,1) as ID,fnum,into #yuecu from store_store where +@Parameter) select XX,XX1,XX2 from #yuecu 这样创建一个临时表...如果我不是使用exec()执行sql语句的话就没有任何问题,WH
  • SQLServer 执行动态SQL语句

    千次阅读 2019-09-22 17:04:38
    执行动态SQL语句 首先定义变量 @Games 为运动会名称, 为动态SQL语句定义变量 ...-- 执行动态SQL语句示例,复制后可直接运行,运行过程中执行SQL3的语句会出错 DECLARE @Games VARCHAR(20) DECLARE @NUM SMA...
  • 存储过程中执行动态Sql语句

    万次阅读 2018-08-26 18:50:28
     MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这...
  • 命令行执行SQL语句

    万次阅读 2017-10-23 17:28:00
    由于之前一直使用可视化界面执行SQL语句,对于命令行执行SQL语句比较陌生,所以,今天尝试了一下,并记录下来,与大家分享;  一、win+r进入doc窗口;  二、找到你电脑里的mysql server安装的环境(本例子为C:\...
  • hibernate执行sql语句更新

    千次阅读 2017-12-17 15:31:40
    hibernate执行sql语句更新
  • PLSQL执行SQL语句

    万次阅读 2018-10-30 16:55:46
    PLSQL执行SQL语句 1、执行中量SQL语句 当执行SQL语句较大时,除运行SQL语句外可以点击工具-------&gt;导入表---------&gt;(出现界面如下图所示) 点击导入就会出现执行语句的窗口如下图所示,把语句...
  • kettle中执行sql语句

    千次阅读 2018-09-14 17:07:18
    1.先找出执行sql语句的控件 2.打开控件,填写要执行的sql语句,主要下图中的红框中选项,后面会介绍各个选项的作用 二、执行sql,变量替换选项,变量指的是kettle相应作用域中的变量(如${report_time}) 该...
  • SQL Server存储过程中执行动态SQL语句

    千次阅读 2015-07-31 16:20:48
    一、简介 在Sql Server中执行动态sql语句有两种方法:exec和exec sp_executesql。 优缺点: 1、exec sp_executesql提供输入、输出接口,可以在sql语句中进行参数占位;exec则不可以。 2、exec sp_executesql能够...
  • EF执行SQL语句

    千次阅读 2018-09-19 09:37:17
    使用EF框架的过程中,有时需要执行SQL语句来提升查询性能,如执行存储过程,进行复杂查询等。下面介绍如何在EF中执行SQL语句。 1.EF执行 SQL查询 string sql = "SELECT sStuID,sStuName FROM [dbo]....
  • Sql字符拼接sql语句动态执行

    千次阅读 2019-07-18 09:07:54
    为了再开发过程中运用存储过程能够更加灵活可以试着使用拼接sql语句,动态执行sql语句,最关键的是使用数据库的关键函数sp_executesql。 首先声明一个参数: declare @SQLWhere nvarchar(3250) 然后给参数...
  • 因为项目中需要做一些操作,比如动态在数据库中创建表,动态给数据库添加字段等等;当时网上找了很多资料没看懂,后来看了一篇文章总算来了灵感,但没保存链接,所以一时没法贴出来。毕竟自己在做的过程中遇到了很多...
  • JDBC执行SQL语句

    千次阅读 2016-03-20 23:34:01
    执行SQL语句 使用PreparedStatement,由PreparedStatement创建,PreparedStatement对象用于发送带有一个或多个输入参数的SQL语句,执行语句时,输入参数将被送到数据库中。PreparedStatement的实例扩展了Statement...
  • 批量执行SQL语句

    千次阅读 2018-12-06 00:38:32
     * 批量执行SQL语句  * 批操作可以一次性向数据库服务端发送若干SQL语句,  * 从而减少与数据库服务端的网络通讯,提高执行效率。  * 事务越多速度越慢,网络调用次数越多,越慢,使用state...
  • ABP中使用执行Sql语句

    千次阅读 2019-05-08 18:27:22
    由于EFCore现在并不支持直接执行sql语句,没有SqlQuery这个函数可以执行。 在ABP中执行Sql语句有三种方式1.ExecuteSqlCommand2.FromSql3.使用RawSqlCommand、RelationalDataReader、DbDataReader进行读取 1.使用...
  • python 执行sql语句

    千次阅读 2019-04-25 20:42:36
    python 执行sql语句 import pymysql #导入模块 def sqlvalue(): #建立连接 conn = pymysql.connect( host='test1267.db.58dns.org', port=13312, user='...
  • dapper 执行sql语句

    千次阅读 2018-12-27 16:54:29
    QQ技术交流群:601122412 ...//执行sql语句,处理 //1.执行sql,转成list List&lt;teacher&gt; list1 = db.SqlQuery&lt;teacher&gt;("select * from teacher where tsex=@tsex", ...
  • PB中执行SQL语句

    千次阅读 2018-10-22 19:33:31
    PowerBuilder的嵌入式SQL语句只能支持一些固定的标准的SQL语句,即在进行程序代码编译处理时这些SQL语句必须是确定的,另外这种方式也不能执行像Creat Table,Creat Database等这些数据库定义的语句(DDL)。...
  • 一、mysql查看正在执行sql语句 show processlist; 二、mysql查看已经执行的历史sql语句(方法:开启日志模式) SETGLOBAL log_output ='TABLE';SETGLOBAL general_log ='ON'; //日志开启 你输入要查的语句,...
  • JDBC执行SQL语句: 一旦获得了链接,我们可以与数据库进行交互。JDBC Statement和PreparedStatement 接口定义了使 您能发送SQL命令并从数据库 进行接收数据的方法和属性。 1.Statement:创建语句对象 在使用...
  • SQL Server循环执行动态SQL语句.

    千次阅读 2015-02-03 15:17:13
    SQL Server循环执行动态SQL语句. 2015年2月3日15:14:20 使用Navicate工具执行查询成功。 declare @name nvarchar(100) declare @sql nvarchar(200) declare @i int set @i =10000 while @i begin set @name =...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 929,612
精华内容 371,844
关键字:

动态执行sql语句