动态SQL详解

Mybatis动态SQL Mybatis动态SQL的基本使用 阅读详情

转自乐沙弥的世界。感谢原作者!

--====================

-- PL/SQL --> 动态SQL

--====================

   

    使用动态SQL是在编写PL/SQL过程时经常使用的方法之一。很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行

SQL查询语句,对于这种情况需要使用动态SQL来完成。再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只

能针对某几个特定的表来形成分页。而使用动态的SQL,则可以对不同的表,不同的字段进行不同的分页。这些情况的处理通常都是用动态SQL来

完成。本文讲述了动态SQL的日常用法。

 

一、动态SQL和静态SQL

    1.静态SQL

       静态SQL通常用于完成可以确定的任务。比如传递部门号调用存储过程,返回该部门的所有雇员及薪水信息,则该语句为

           SELECT ename,sal INTO lv_ename,lv_sal FROM scott.emp WHERE deptno=&dno;

       对于上述类似的DML语句在第一次运行时进行编译,而后续再次调用,则不再编译该过程。即一次编译,多次调用,使用的相同的执行

        计划。此种方式被称之为使用的是静态的SQL。

      

    2.动态SQL

       动态SQL通常是用来根据不同的需求完成不同的任务。比如分页查询,对于表emp分页,需要使用字段雇员姓名,薪水,雇用日期,且按

       薪水降序生成报表,每页显示行数据。而对于表sales,需要使用字段雇员名称,客户名称,销售数量,销售日期,且按销售日期升序

       排列。以上两种情况,可以创建存储过程来对其进行分页,通过定义变量,根据输入不同的表名,字段名,排序方法来生成不同的SQL

       语句。对于输入不同的参数,SQL在每次运行时需要事先对其编译。即多次调用则需要多次编译,此称之为动态SQL。

       动态SQL语句通常存放在字符串变量中,且SQL语句可以包含占位符(使用冒号开头)。

       也可以直接将动态SQL紧跟在EXECUTEIMMEDIATE语句之后,如EXECUTE IMMEDIATE 'altertable emp enable row movement'

      

    3.两者的异同

       静态SQL为直接嵌入到PL/SQL中的代码,而动态SQL在运行时,根据不同的情况产生不同的SQL语句。

       静态SQL为在执行前编译,一次编译,多次运行。动态SQL同样在执行前编译,但每次执行需要重新编译。

       静态SQL可以使用相同的执行计划,对于确定的任务而言,静态SQL更具有高效性。但缺乏灵活性

       动态SQL使用了不同的执行计划,效率不如静态SQL,但能够解决复杂的问题。

       动态SQL容易产生SQL注入,为数据库安全带来隐患。

      

    4.动态SQL语句的几种方法

       a.使用EXECUTEIMMEDIATE语句

           包括DDL语句,DCL语句,DML语句以及单行的SELECT 语句。该方法不能用于处理多行查询语句。

       b.使用OPEN-FOR,FETCH和CLOSE语句

           对于处理动态多行的查询操作,可以使用OPEN-FOR语句打开游标,使用FETCH语句循环提取数据,最终使用CLOSE语句关闭游标。

       c.使用批量动态SQL

           即在动态SQL中使用BULK子句,或使用游标变量时在fetch中使用BULK ,或在FORALL语句中使用BULK子句来实现。

       d.使用系统提供的PL/SQL包DBMS_SQL来实现动态SQL,关于该方式请参考后续博文。   

 

二、动态SQL的语法

    下面是动态SQL常用的语法之一

   

       EXECUTEIMMEDIATE dynamic_SQL_string

       [INTOdefined_variable1, defined_variable2, ...]

       [USING[IN | OUT | IN OUT]bind_argument1, bind_argument2,

       ...][{RETURNING| RETURN} field1, field2, ... INTO bind_argument1,

       bind_argument2,...]

 

    1.语法描述

       dynamic_SQL_string:存放指定的SQL语句或PL/SQL块的字符串变量

       defined_variable1:用于存放单行查询结果,使用时必须使用INTO关键字,类似于使用SELECT ename INTO v_name FROM scott.emp;

           只不过在动态SQL时,将INTOdefined_variable1移出到dynamic_SQL_string语句之外。

       bind_argument1:用于给动态SQL语句传入或传出参数,使用时必须使用USING关键字,IN表示传入的参数,OUT表示传出的参数,

           IN OUT则既可以传入,也可传出。

       RETURNING| RETURN 子句也是存放SQL动态返回值的变量。

 

    2.使用要点

        a.EXECUTEIMMEDIATE执行DML时,不会提交该DML事务,需要使用显示提交(COMMIT)或作为EXECUTEIMMEDIATE自身的一部分。

       b.EXECUTEIMMEDIATE执行DDL,DCL时会自动提交其执行的事务。

       c.对于多行结果集的查询,需要使用游标变量或批量动态SQL,或者使用临时表来实现。

       d.当执行SQL时,其尾部不需要使用分号,当执行PL/SQL 代码时,其尾部需要使用分号。

       f.动态SQL中的占位符以冒号开头,紧跟任意字母或数字表示。

      

三、动态SQL的使用(DDL,DCL,DML以及单行结果集)     

      

    1.使用EXECUTEIMMEDIATE处理DDL操作

       下面是一个简单的DDL操作,将其封装在存储过程之中,通过传入表名来进行调用。

   

       CREATE OR REPLACE PROCEDURE trunc_table(table_nameVARCHAR2)  --创建存储过程trunc_table

       IS

         sql_statementVARCHAR2(100);

       BEGIN

         sql_statement := 'TRUNCATETABLE' || table_name;           --为变量进行赋值,用于生成动态SQL语句

         EXECUTE IMMEDIATEsql_statement;                            --使用EXECUTEIMMEDIATE执行动态SQL语句

       END;

       /

 

       flasher@ORCL> create table tb2                                --从scott.emp生产表tb2

         2  as select empno,ename,sal,deptno from scott.emp;

 

       flasher@ORCL> select count(1) from tb2;

 

         COUNT(1)

       ----------

              14

             

       flasher@ORCL> exec trunc_table('tb2');                        --调用存储过程来对表tb2进行truncate

 

       flasher@ORCL> select count(1) from tb2;                       --表tb2被清空

 

         COUNT(1)

       ----------

               0    

 

       flasher@ORCL> insert into tb2                                 --重新为表tb2生成记录

         2  select empno,ename,sal,deptno from scott.emp;

 

       flasher@ORCL> commit;

 

    2.使用EXECUTEIMMEDIATE处理DCL操作  

       下面使用sys帐户创建存储过程grant_sys_priv用于给用户授予权限

      

       sys@ORCL> connsys/redhat@orcl as sysdba

 

       CREATE OR REPLACE PROCEDURE grant_sys_priv(privVARCHAR2, username VARCHAR2)

       IS

           sql_statVARCHAR2(100);

       BEGIN

           sql_stat := 'GRANT' || priv || 'TO' || username; 

           EXECUTE IMMEDIATEsql_stat;

       END;

       /  

 

       sys@ORCL> exec grant_sys_priv('connect','usr1');

 

    3.使用EXECUTEIMMEDIATE处理DML操作

       在使用EXECUTEIMMEDIATE处理DML操作时,分为几种情况,即不带输入参数,带输入参数,既有输入也有输出参数或返回参数等不同情

       况,下面分别对其描述。  

 

       a.没有参数传入传出的DML语句

           下面的示例中,使用动态SQL删除一条记录,且未使用参数传入。

          

           flasher@ORCL> select * from tb2 where empno=7900;          --删除前

 

               EMPNOENAME             SAL     DEPTNO

           -------------------- ---------- ----------

                7900JAMES             950         30

 

           flasher@ORCL> DECLARE sql_statVARCHAR2(100);

             2  BEGIN

             3    sql_stat:='DELETEFROM flasher.tb2 WHEREempno=7900';   --使用动态SQL来删除记录

             4    EXECUTE IMMEDIATEsql_stat;

             5  END;

             6  /

 

           flasher@ORCL> SELECT * FROM tb2 where empno=7900;              --验证删除情况

 

           no rowsselected

 

       b.有参数传入的DML语句(使用USING子句)

           对于使用了参数传入的动态SQL,需要使用USING子句来指明传入的参数。在下面的示例中,为表tb2插入一条记录,在DML语句中使

           用了四个占位符(占位符用以冒号开头,紧跟任意字母或数字表示)。因此在使用EXECUTEIMMEDIATE使用USING子句为其指定其参数。

          

           DECLARE                  --声明变量

             sql_statVARCHAR2(100);

             lv_empnotb2.empno%TYPE := 7900;

             lv_enametb2.ename%TYPE := 'JAMES';

             lv_sal   tb2.sal%TYPE := 950;

 

           BEGIN

             sql_stat := 'INSERTINTO tb2VALUES(:1,:2,:3,:4)';                --DML语句中使用了占位符

             EXECUTE IMMEDIATEsql_stat USINGlv_empno, lv_ename,lv_sal,30;    --为占位符指定参数或值

             COMMIT;

           END;

           /

 

           flasher@ORCL> select * from tb2 where empno=7900;                   --验证插入后的结果

 

               EMPNOENAME             SAL     DEPTNO

           -------------------- ---------- ----------

                7900JAMES             950         30

     

       c.处理包含returning子句的DML语句

           下面的示例中,对表tb2进行更新,使用了两个占位符,一个是:percent,一个是:eno,因此在使用EXECUTEIMMEDIATE执行动态

           DML时,需要使用USING子句且带两个输入参数。其次,动态DML中使用了RETURNINGsal INTO :salary,因此EXECUTE IMMEDIATE后

           也必须使用RETURNINGINTO varialbe_name。

          

           DECLARE

             salaryNUMBER(6, 2);

             sql_statVARCHAR2(100);

           BEGIN

             sql_stat := 'UPDATEtb2 SET sal = sal * (1 + :percent /100)'   --更新sal列,使用占位符:percent

                || 'WHERE empno = :eno RETURNING sal INTO:salary';      --使用了占位符:eno,:salary,以及RETURNING子句

             EXECUTE IMMEDIATEsql_stat USING &1, &2RETURNING INTO salary;  --必须使用USING及RETURNING子句

             COMMIT;

             dbms_output.put_line('Newsalary: ' || salary);

           END;

           /

 

           Enter value for 1: 10

           Enter value for 2: 7900

           old   7:   EXECUTE IMMEDIATEsql_stat USING &1, &2RETURNING INTO salary;

           new   7:   EXECUTE IMMEDIATEsql_stat USING 10, 7900RETURNING INTO salary;

           Newsalary: 1045

   

       d.处理包含检索值的单行查询

           下面的示例中,使用SELECT 查询获得单行结果集,使用了占位符:name,因此也需要使用USING子句为其传递参数

          

           DECLARE

             sql_statVARCHAR2(100);

             emp_recordtb2%ROWTYPE;

           BEGIN

             sql_stat := 'SELECT* FROM tb2 WHERE ename =UPPER(:name)';     --动态SQL语句为单行DQL语句

             EXECUTE IMMEDIATEsql_stat INTO emp_recordUSING '&name';       --使用USING子句为其传递参数

             DBMS_OUTPUT.PUT_LINE('Thesalary is' || emp_record.sal || 'for '||emp_record.ename);

           END;

           /

 

           Enter value for 1: james

           old   6:   EXECUTE IMMEDIATEsql_stat INTO emp_recordUSING '&1';

           new   6:   EXECUTE IMMEDIATEsql_stat INTO emp_recordUSING 'james';

           Thesalary is 1045 for JAMES

 

四、动态SQL的使用(处理多行结果集的查询语句)  

    1.使用游标变量来循环提取数据,其主要流程为

       定义游标变量

           TYPE cursortype IS REF CURSOR;

           cursor_variablecursortype;

       打开游标变量

           OPEN cursor_variable FOR dynamic_string

           [USINGbind_argument[,bind_argument]...]

       循环提取数据

           FETCH cursor_variable INTO {var1[,var2]...| record_variable};

           EXIT WHEN cursor_variable%NOTFOUND

       关闭游标变量

           CLOSE cursor_variable;

   

    2.使用游标变量处理查询多行结果集

       下面的示例中,首先定义了一个游标类型,接下来定义游标变量,以及存放结果集的变量,动态查询语句将获得多个结果集。

       OPEN cursorname FOR SELECT ... 时,其SELECT 语句使用了字符串变量(动态SQL),其后紧跟USING子句。

   

       DECLARE                             --游标,变量的声明

         TYPE emp_cur_type IS REF CURSOR;

           emp_cv       emp_cur_type;

           emp_record   tb2%ROWTYPE;

           sql_stat     VARCHAR2(100);

           v_dno        NUMBER := &dno;

        

       BEGIN

         sql_stat := 'SELECT* FROM tb2 WHERE deptno =:dno';   --动态多行结果集查询语句

         OPEN emp_cv FOR sql_statUSINGv_dno;                   --OPEN 时使用动态查询语句以及USING子句来传递参数

         LOOP

           FETCH emp_cv INTO emp_record;                        --从结果集中提取记录

           EXIT WHEN emp_cv%NOTFOUND;

           dbms_output.put_line('Employeename:' || emp_record.ename || ',  Salary:' || emp_record.sal);

         END LOOP;

         CLOSE emp_cv;

       END;

       /

 

       Employee name:Henry,  Salary:

       Employee name:JONES,  Salary:

       Employee name:ADAMS,  Salary:

       Employee name:FORD,  Salary:

 

五、动态SQL的使用(FORALL及BULK子句的使用)        

    1.动态SQL中使用BULK子句的语法

   

       EXECUTEIMMEDIATEdynamic_string                          --dynamic_string用于存放动态SQL字符串

       [BULKCOLLECT INTOdefine_variable[,define_variable...]]  --存放查询结果的集合变量

       [USINGbind_argument[,argument...]]                       --使用参数传递给动态SQL

       [{RETURNING|RETURN}                                     --返回子句

       BULKCOLLECT INTOreturn_variable[,return_variable...]];  --存放返回结果的集合变量

                 

       使用bulkcollectinto子句处理动态SQL中的多行查询可以加快处理速度,从而提高应用程序的性能。当使用bulk子句时,集合类型可

       以是PL/SQL所支持的索引表、嵌套表和VARRY,但集合元素必须使用SQL数据类型。常用的三种语句支持BULK子句,分别为EXECUTE

       IMMEDIATE,   FETCH 和FORALL。

      

    2.使用EXECUTEIMMEDIATE 结合BULK子句处理DML语句返回子句

       下面的例子,首先定义了两个索引表类型以及其变量,接下来使用动态SQL语句来更新tb2的薪水,使用EXECUTEIMMEDIATE配合BULK

       COLLECTINTO 来处理结果集。

      

       DECLARE

         TYPE ename_table_type IS TABLE OF tb2.ename%TYPE INDEX BY BINARY_INTEGER;  --定义类型用于存放结果集

         TYPE sal_table_type IS TABLE OF tb2.sal%TYPE INDEX BY BINARY_INTEGER;

           ename_tableename_table_type;

           sal_tablesal_table_type;

           sql_statVARCHAR2(120);

           v_percentNUMBER :=&percent;

           v_dno     NUMBER :=&dno;

        

       BEGIN

         sql_stat := 'UPDATEtb2 SET sal = sal * (1 + :percent /100)'              --动态DML语句

             || 'WHERE deptno = :dno'

             || 'RETURNING ename, sal INTO :name,:salary';                        --使用了RETURNING子句,有返回值

         EXECUTE IMMEDIATEsql_stat USINGv_percent, v_dno                          --执行动态SQL语句

           RETURNING BULK COLLECT INTO ename_table, sal_table;                      --使用BULKCOLLECT INTO到集合变量

         FOR i IN 1..ename_table.COUNT                                              --使用FOR循环读取集合变量的结果

         LOOP

           DBMS_OUTPUT.PUT_LINE('Employee' || ename_table(i) || 'Salary is:' || sal_table(i));

         END LOOP;

       END;

       /

 

       EmployeeHenry Salary is: 1694

       EmployeeJONES Salary is: 3841.75

       EmployeeADAMS Salary is: 1573

       EmployeeFORD Salary is: 3872

 

    3.使用EXECUTEIMMEDIATE 结合BULK子句处理多行查询

       下面示例中,与前一个示例相同,只不过其动态SQL有查询语句组成,且返回多个结果集,同样使用了BULKCOLLECT INTO来传递结果。

      

       DECLARE

         TYPE ename_table_type IS TABLE OF tb2.ename%TYPE INDEX BY BINARY_INTEGER; --定义类型用于存放结果集

         TYPE sal_table_type IS TABLE OF tb2.sal%TYPE INDEX BY BINARY_INTEGER;

           ename_tableename_table_type;

           sal_tablesal_table_type;

           sql_statVARCHAR2(100);

       BEGIN

         sql_stat := 'SELECTename,sal FROM tb2 WHERE deptno =:dno';              --动态DQL语句,未使用RETURNING子句

         EXECUTE IMMEDIATEsql_stat BULK COLLECT INTO ename_table,sal_tableUSING &dno;  --使用BULKCOLLECT INTO

         FOR i IN 1..ename_table.COUNT

         LOOP

           DBMS_OUTPUT.PUT_LINE('Employee' || ename_table(i) || 'Salary is:' || sal_table(i));

         END LOOP;

       END;

       /

 

       EmployeeHenry Salary is: 1694

       EmployeeJONES Salary is: 3841.75

       EmployeeADAMS Salary is: 1573

       EmployeeFORD Salary is: 4259.2

 

    4.使用FETCH子句结合BULK子句处理多行结果集

       下面的示例中首先定义了游标类型,游标变量以及复合类型,复合变量,接下来从动态SQL中OPEN游标,然后使用FETCH将结果存放到复

       合变量中。即使用OPEN,FETCH代替了EXECUTEIMMEDIATE来完成动态SQL的执行。

      

       DECLARE

         TYPE empcurtype IS REF CURSOR;         --定义游标类型及游标变量

         emp_cvempcurtype;

         TYPE ename_table_type IS TABLE OF tb2.ename%TYPE INDEX BY BINARY_INTEGER;  --定义结果集类型及变量

         ename_tableename_table_type;

         sql_stat    VARCHAR2(120);

       BEGIN

         sql_stat := 'SELECTename FROM tb2 WHERE deptno =:dno';      --动态SQL字符串

         OPEN emp_cv FOR sql_stat                                      --从动态SQL中打开游标

           USING &dno;

         FETCH emp_cv BULK COLLECT                                     --使用BULKCOLLECT INTO提取结果集

           INTO ename_table;

         FOR i IN 1 .. ename_table.COUNT LOOP

           DBMS_OUTPUT.PUT_LINE('EmployeeName is ' || ename_table(i));

         END LOOP;

         CLOSE emp_cv;

       END;

       /

 

       Employee Name is Henry

       Employee Name is JONES

       Employee Name is ADAMS

       Employee Name is FORD

 

    5.使用FORALL语句中使用BULK子句

       下面是FORALL子句的语法

      

       FORALLindex IN lower bound..upperbound           --FORALL循环计数

           EXECUTEIMMEDIATEdynamic_string               --结合EXECUTEIMMEDIATE来执行动态SQL语句

           USINGbind_argument | bind_argument(index)     --绑定输入参数

              [bind_argument| bind_argument(index)]...

           [{RETURNING| RETURN} BULK COLLECT INTObind_argument[,bind_argument...]];  --绑定返回结果集

      

       FORALL子句允许为动态SQL输入变量,但FORALL子句仅支持DML(INSERT,DELETE,UPDATE)语句,不支持动态的SELECT语句。

       下面的示例中,首先声明了两个复合类型以及复合变量,接下来为复合变量ename_table赋值,以形成动态SQL语句。紧接着使用FORALL

       子句结合EXECUTEIMMEDIATE 来提取结果集。

      

       DECLARE                                                 --定义复合类型及变量

         TYPE ename_table_type IS TABLE OF tb2.ename%TYPE;    

         TYPE sal_table_type IS TABLE OF tb2.sal%TYPE;

           ename_tableename_table_type;

           sal_tablesal_table_type;

           sql_statVARCHAR2(100);

       BEGIN

         ename_table := ename_table_type('BLAKE', 'FORD', 'MILLER');   --为复合类型赋值

         sql_stat := 'UPDATEtb2 SET sal = sal * 1.1 WHERE ename =:1' --定义动态SQL语句

             || 'RETURNING sal INTO :2';

         FORALLi IN 1..ename_table.COUNT                              --为FORALL 设定起始值

           EXECUTE IMMEDIATEsql_stat USING ename_table(i) --使用EXECUTEIMMEDIATE 结合RETURNING BULK COLLECT INTO获取结果集

             RETURNING BULK COLLECT INTO sal_table;

         FOR j IN 1..ename_table.COUNT

         LOOP

           DBMS_OUTPUT.PUT_LINE('Thenew salary is' || sal_table(j) || 'for ' ||ename_table(j)) ;

         END LOOP;

       END;

       /

          

       Thenewsalary is 3135 for BLAKE

       Thenewsalary is 4259.2 for FORD

       Thenewsalary is 1760 for MILLER 

动态SQL语句基本语法 动态SQL语句基本语法 动态SQL语句基本语 立即下载

相关推荐

基于OpenCV的驾驶疲劳检测与预警系统设计

PERCLOS(Percentage of Eye Closure)是一种基于眼睑闭合程度的疲劳度量指标。在基于OpenCV的驾驶疲劳检测与预警系统设计中,PERCLOS可以用于检测驾驶员的眼睑闭合程度,以判断其是否疲劳。该函数用于检测视频流中人脸的疲劳程度。具体地,该函数通过检测人脸的眼睛和嘴巴的状态来评估人脸的疲劳程度。眼睛状态是通过计算眼睛的长宽比(eyear)来判断,如果长宽比小于某个阈值,则认为眼睛闭合,表示人处于疲劳状态。

2301_79810943的博客 2327

动态sql

1111111111111111

weixin_46737745的博客 674

淘宝滑块验证码破解:Python模拟鼠标轨迹过关详解

本文全面解析了淘宝滑块验证码的破解流程,从机制分析、图像处理、轨迹模拟到自动化实现,提供了完整的Python解决方案。随着2026年风控技术的升级,单纯依靠轨迹模拟已经难以达到高通过率,未来趋势是结合强化学习生成更自然的轨迹,并利用深度神经网络进行端到端的验证码绕过。此外,各大平台正逐步推广"无感验证"和"行为式验证码",将验证融入到用户正常操作中,这对爬虫技术提出了更高的挑战。技术本身是中立的,关键在于使用者的目的。希望本文能帮助开发者更好地理解验证码对抗技术,从而设计出更安全的防御系统。

2201_76125261的博客 95

什么是动态Sql

动态SQL是一种在运行时构建和执行SQL语句的技术。通常情况下,静态SQL是预先定义好的SQL语句,而动态SQL允许根据程序运行时的条件和需求来动态地生成SQL语句。动态SQL的主要优点是灵活性和适应性。它可以根据不同的情境和需求生成不同的SQL语句,从而提供更高的灵活性和可重用性。例如,在一个搜索功能中,用户可能根据不同的条件来进行搜索,使用动态SQL可以根据用户输入的条件来构建相应的查询语句。

lw12345118的博客 6687

【ComfyUI】多模型 户型图风格渲染效果图

本文介绍了一种基于ComfyUI的室内户型图自动渲染工作流,将平面图转换为风格化效果图。该工作流通过RH_Captioner节点识别空间布局,结合Qwen2.5模型优化文本描述,再使用定制室内设计模型生成渲染图。整个流程包含图像输入、空间识别、文本组织、语言生成、风格转换和渲染输出等9个阶段,各节点协同完成从户型图到效果图的全自动转换。系统融合了语言理解和图像生成技术,可广泛应用于室内设计、装修可视化等领域。

Mr数据杨 3007

uniapp - H5网页打包运行报错Failed to load resource: net::ERR_FILE_NOT_FOUND(uniApp打包成H5部署到服务器,打包h5白屏并报错页面空白)

Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp 坑之打包之后白屏,uniapp打包h5,HBuilderX 打包H5后空白报错 Failed to load resource: net::ERR FILE NOT_FOUND,UNI-APP H5应用白屏(空白页)解决方案,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp开发,打包成H5部署到服务器,uniapp打包之后首页

🏆 前端领域优质创作者 3576

动态 SQL

本篇带你学习 MyBatis 动态 SQL 操作,条件查询、更新以及复杂查询。

m0_52861684的博客 5647

【软考高项论文】论信息系统项目管理的干系人绩效域

例如,在处理与电信运营商合作铺设光纤网络的问题时,考虑到其在通信设施建设和运维方面的专业性和重要性,我们将之定位为高权力高利益的干系人,给予了高度关注和优先沟通。项目全程,我们对干系人绩效域的执行效果进行了定期检查和评估,通过定量与定性的数据收集,确认了项目在干系人管理上的成效,具体表现为:建立了稳固的工作关系网络,使干系人普遍认可项目目标;鉴于本项目牵涉到政府各级部门、企事业单位、市民团体、技术研发伙伴等多种类型的干系人,且干系人的诉求和影响力各异,因此,有序且持续的干系人参与管理显得尤为关键。

Programming Talk 1681

MyBatis动态SQL详解

MyBatis动态SQL

SGLP521的博客 3万+

28、沉浸式体验技术:概念、类型与应用

本文全面介绍了沉浸式体验技术的概念、类型与应用。从双边滤波器的图像处理原理切入,系统阐述了VR、AR、MR、ER及数字孪生等核心技术的特点与区别,并通过丰富案例展示了其在商业、医疗、教育、旅游、房地产、物流等多个领域的实际应用。文章还分析了技术融合趋势、硬件升级方向、应用场景拓展潜力,同时探讨了数据处理、网络延迟、隐私安全等挑战及应对策略,最后以流程图和对比表格总结技术发展脉络,展望沉浸式技术推动社会进步的广阔前景。

wind6的博客 379

UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计

本文提出一种结合注意力机制的改进UNet网络,通过引入残差注意力模块(ResidualAttentionBlock)增强医学图像分割性能。该网络在传统UNet的U型结构基础上,创新性地将轻量级注意力机制与残差连接相结合,在编码器-解码器各层级实现特征重标定。改进后的网络具有三方面优势:通过注意力机制自适应聚焦关键特征区域,利用残差连接缓解梯度消失问题,采用模块化设计灵活配置注意力位置。

2501_91516851的博客 780

MyBatis 动态SQL 详解!

动态 SQL 是指在 SQL 语句中,根据不同的条件或参数,生成不同的 SQL 语句。💡

qq_56158663的博客 1710

生存曲线绘制及图例标签添加(使用R语言)

数据应该包含两列:一个是表示个体生存时间的时间变量(通常称为"时间(time)“)和一个是表示个体是否发生事件(如死亡)的事件变量(通常称为"事件(event)”)。通过修改上述代码中的数据和参数,您可以根据自己的需求绘制生存曲线,并添加相应的图例信息和标签。生存曲线是在生存分析中常用的工具,用于描述一组个体随时间的存活概率。函数的第一个参数指定图例的位置,这里我们选择了右上角(“topright”)。包来进行生存曲线的绘制,并通过添加图例信息和标签来增强可视化效果。的数据框,包含这两列数据。

CyberXZ的博客 555

MyBatis 动态 SQL 详解

在使用 MyBatis 进行数据库查询时,可能会遇到一些需要根据条件动态生成 SQL 语句的情况。MyBatis 提供了强大的动态 SQL 支持,通过标签和条件语句,可以让 SQL 语句根据不同的输入参数动态生成。这大大提高了代码的灵活性,避免了拼接 SQL 语句的繁琐和出错风险。

m0_64974617的博客 1793

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MyBatis 动态 SQL 使用详解

动态 SQL

alivinFer的个人博客 1215

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MyBatis 动态SQL详解

注意,``失败后, `` 关键字只会去掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即注意,`` 只会去掉`` 语句中的最开始的and关键字。在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。这个标签和是天仙配,是共生的,include用于引用sql标签定义的常量。

Coisini__S的博客 1268

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

详解mybatis动态SQL

什么是动态SQL? 动态 SQL 是 MyBatis 的强大特性之一。顾名思义,就是会动的SQL,即是能够灵活的根据某种条件拼接出完整的SQL语句。这种类似于MySQL中的case when then else then end....这种语法,能够根据某种条件动态的拼接出需要的SQL。 至于Mybatis如何实现动态SQL呢,Mybatis提供了非常多的标签,能够让我们在XML文件中灵活的运用这些标签达到拼接SQL的目的。 常用的标签 Mybatis为了能够让开发者灵活的写SQL也是费了一番功夫..

qq1353424111的博客 3万+

动态SQL

动态SQL指的是根据不同的输入参数或条件,动态生成SQL语句的能力。MyBatis 提供了一些标签,用于在映射文件中编写动态 SQL 语句,以满足灵活的查询、插入、更新、删除等需求。

gege_0606的博客 1470

【Mybatis】动态SQL详解

什么是动态SQL?if+set if+where if+trim foreach choose sql

m0_66584716的博客 1172

强大的动态SQL

用于实现动态SQL的元素if:利用if实现简单的条件选择choose(when,otherwise):相当于java中的switch语句,通常与when和otherwise搭配where:简化Sql语句中where的条件判断set:解决动态更新语句trim:可以灵活的去除多余的关键字foreach:迭代一个集合,通常用于in条件那么,问题来了: 什么是动态SQL? 动态SQL有什么作用?传统的使用...

qq_40490518的博客 6775

MyBatis的动态SQL详解

基础部分可以查看我的另一篇博客:http://haohaoxuexi.iteye.com/blog/1333271   MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有:   if choose(when,otherwise) trim where set foreach

zylzb的专栏 1万+

【MyBatis】动态SQL

在前一篇中,我们已经讲解了Mybatis的基本使用,那么本篇我们就进一步来了解Mybatis的功能。本篇我们主要讲的是Mybatis中的动态SQL,在前面我们的学习中,我们编写的SQL语句基本都是固定的,每个参数都需要传递,而通过动态SQL,它能根据我们所给的参数,动态地选择参数,不需要每个都传递。

zhyhgx的博客 2203

Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?

1.Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理? 1.动态SQL的概念 ​ 动态sql是指在进行sql操作的时候,传入的参数对象或者参数值,根据匹配的条件,有可能需要动态的去判断是否为空,循环,拼接等情况; 2.动态Sql的标签大致有以下几种 if 和 where 标签和include标签 ​ if标签中可以判断传入的值是否符合某种规则,比如是否不为空; ...

weixin_42427551的博客 8455

Oracle 动态SQL

动态SQL是在运行时动态构建和执行的SQL语句。与静态SQL相比,动态SQL的主要优势是可以根据不同条件生成不同的查询语句,从而提供更灵活的查询能力。动态SQL在处理复杂查询逻辑、动态过滤条件和动态列选择等方面非常有用。Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate。

weixin_46268997的博客 1967
上一篇: 电子商务系统的设计与实现(十一):数据库设计
下一篇: MyBatis 实践 -动态SQL/关联查询
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值