精华内容
下载资源
问答
  • * 超大字符串拼接,单个字符串4000、分隔符100,可拼出超4000的超长字符串 * 可自定义指定分隔符separator * 可自定义指定排序字段sequence,对于数字或日期类型的字段,先转为字符串,比如to_char(line, 'FM000'...
  • 具体场景:在动态SQL中,我们需要把一段字符加工为我们所需要的SQL,这里举个例子,当前台传入字符为 ‘a,b,c,d’ ,需要把该字符加工为 (‘a’,‘b’,‘c’,‘d’) ,作为... piStr IN varchar2, --需要加工的字符串.
    • 具体场景:在动态SQL中,我们需要把一段字符加工为我们所需要的SQL,这里举个例子,当前台传入字符为 ‘a,b,c,d’ ,需要把该字符加工为 (‘a’,‘b’,‘c’,‘d’) ,作为in语句的条件才能使用。知道了怎么拆分和拼接,就有了思路,其他场景的分割和拼接也就好做了。
    • 拆分并加工拼接SQL:
    --输入 'a,b,c,d'
    --输出 ('a','b','c','d')
    FUNCTION splitAndHandleStr(
       piStr    IN  varchar2,  --需要加工的字符串
       piSymbol IN  varchar2   --用来做分割的字符
     ) Return Varchar2
     IS
       outStr        varchar2(200);--输出字符
       surplusStr    varchar2(200);--剩余字符
       idx           int;--分割符的位置标记
       cutStr        Varchar2(200);--截取分割位置前的字符
       handleStr     Varchar2(200);--拼接处理字符
     Begin
       surplusStr := piStr;
    
       --当剩余字符里没有分割符时跳出循环
       While inStr(surplusStr,piSymbol) <> 0 Loop
         idx := inStr(surplusStr, piSymbol);
         cutStr := subStr(surplusStr, 1, idx - 1);
         handleStr := handleStr || '''' || cutStr || ''',' ;
         surplusStr := subStr(surplusStr, idx+1, length(surplusStr) - (length(cutStr)+1));
       End Loop;
    
       --当跳出循环后,如果剩余字符不为空,说明还有字符,需进行拼接处理
       If is_not_null(surplusStr) = 1 And  surplusStr <> piSymbol Then
         handleStr := handleStr || '''' || surplusStr || ''',';
       End iF;
    
       --移除最后逗号,加工成最终输出数据
       outStr := '(' || SubStr(handleStr, 1, Length(handleStr)-1) || ')';
       Return outStr;
     End;
    
    展开全文
  • ||的拼接可以实现两个或者多个字符串拼接。例如:‘aaa’||‘bbb’||‘ccc’,下面为实际工作批量更新字段长度的实例 select 'alter table ' || a.TABLE_NAME || ' modify ' || a.COLUMN_NAME || ' ' || a.DATA...

    1. 使用||拼接:

    ||的拼接可以实现两个或者多个字符串的拼接。例如:‘aaa’||‘bbb’||‘ccc’,下面为实际工作中批量更新字段长度的实例

    select 'alter table ' || a.TABLE_NAME || ' modify ' || a.COLUMN_NAME || ' ' ||
           a.DATA_TYPE || '(' || a.DATA_LENGTH * 2 || ');'
      from user_tab_columns a
     where a.TABLE_NAME in ('T_DWD_XD_MX')
       and a.DATA_TYPE = 'VARCHAR2'
    

    结果如下:
    在这里插入图片描述

    2. concat() :

    oracle的concat只支持两个字符串的拼接,如果使用多个字符串拼接就要嵌套,用起来很麻烦,所以很少使用。

    select concat('AAAA','BBBB' ) from dual;
    显示结果:	AAAABBBB
    

    3. listagg()实现多行合并:

    下面这个练习实例: 现有各班级选修课程列表,如下图:其中NUM为报名人数
    在这里插入图片描述

    现期望得到如下结果:
    在这里插入图片描述

    create table LX_20200218
    (
      class_id NUMBER,
      c_name   VARCHAR2(30),
      num      NUMBER
    )
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (1, 'Python', 20);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (1, 'java', 16);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (1, 'C++', 5);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (2, 'Python', 31);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (2, 'java', 22);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (3, 'R', 3);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (3, 'Python', 18);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (3, 'java', 11);
     
    insert into lx_20200218 (CLASS_ID, C_NAME, NUM)
    values (3, 'C++', 5);
    

    答案:

    select a.class_id, wm_concat(a.c_name || '(' || a.num || ')' || '人') as 结果
      from lx_20200218 a
     group by a.class_id;
    

    如果oracle升级到12C之后 wm_concat就不能使用了,要换成下面写法,或者自己在12C环境创建该函数

    select a.class_id,
           listagg(a.c_name|| '(' || a.num || ')' || '人', ',') WITHIN GROUP(ORDER BY a.c_name) 
      from lx_20200218 a
    group by a.class_id
    
    展开全文
  • 之前项目写的一个大的存储过程 中间用到的SQL字符串拼接的方法 来完成业务的流程 类似SQL的动态拼接把 为什么要有用到这种形式 因为我这个存储过程里面要处理 至少三个系统的六种情况 所以使用拼接的方式是最...

    之前项目中写的一个大的存储过程 中间用到的SQL字符串拼接的方法 来完成业务的流程 类似SQL的动态拼接把

     

    为什么要有用到这种形式 因为我这个存储过程里面要处理 至少三个系统的六种情况 所以使用拼接的方式是最容易想到的

     

    存储过程大概意思 先将查询到的数据存放到临时表中 然后再对临时表的数据做遍历,这里不说这个了

     

    直接正题: (以对数据做处理) 之前都是这样直接写的

    但是这有个严重的问题 就是用字符串拼接的方法实现的sql , 如果传入的参数 是非法的 如(or ' 1=1 --)很容易造成SQL注入的问题

       V_SQL := ' INSERT INTO TEMP_Table(t1,t2,t3,t4,t5,t6)
                    select
                           .....
                    from USER_BASIC ub
                            left join ......
                    where ud.xxxx = ''xxx''';
    
                    --传入LK_QUERY_USER_ID
                    IF LK_QUERY_USER_ID IS NOT NULL THEN
                        V_SQL := V_SQL || ' and ub.USER_ID like ''%' || LK_QUERY_USER_ID || '%''' ;
                    end if;
                       
                    -- 过滤不需要返回的人员  属于正则表达式分割
                        IF LK_FORWARD_USER IS NOT NULL THEN
                            V_SQL := V_SQL || ' and ub.USER_ID not in (
                    SELECT REGEXP_SUBSTR( ''' || LK_FORWARD_USER || ''', ''[^,]+'', 1, ROWNUM) userId
                    FROM DUAL
                    CONNECT BY ROWNUM <=
                               LENGTH(''' || LK_FORWARD_USER || ''') -
                               LENGTH(REGEXP_REPLACE(''' || LK_FORWARD_USER || ''', '','', '''')) + 1)';
                        end if;
                        
                        
                     --过滤掉当前操作人
                       IF LK_USER_ID IS NOT NULL THEN
                           V_SQL := V_SQL || 'and ub.USER_ID !=''' || LK_USER_ID || '''';
                       end if;   
    
                       --执行操作
                       execute immediate V_SQL;

    处理方法

    第一 最简单的 方法 我认为是 用Java程序对传入的参数 进行校验 符合规则的才能让其调用存储过程 否则不能调用 这就解决了 sql注入的大部分问题 当然 这不是 今天的主题...

     

    防止SQL注入的方法

    因为我是使用的是  execute immediate V_SQL; 执行的

    这里就不得不说一下 execute immediate 的特性了

    用法3
        v_sql:= ' select t.user_id FROM sys_users t where t.user_name = :1';
        execute immediate v_sql into v_dname using v_item ;
        
    用法4
        v_sql := 'BEGIN :1 := ' || 'sys_users_pkg.get_user_id' || '(:2,:3,:4,:5);END;';
      execute immediate v_sql using out v_user_id, in p_user_name, in p_password, 
        in p_parameter_other_1, p_parameter_other_2;
    
    • :1,:2 这样的字符代表占位符,在v_sql整个字符串中它代表的意义是需要等待指定的,我们可以使用using关键字指定 占位符 上是什么。
    • in 和 out 是 输入/输出的意思,in是默认的参数类型可以省略
    • 使用了using 但是没使用 in 或者out 关键字 那就是 in类型。
    • using aa 等价于 using in aa
    • using out aa 使用aa这个变量或字面量(没打错)去替换对应位置的占位符

     

    懂了吧 知道怎么去 处理注入的问题了把 我们可以利用 using xxx 这个特性 将 入参 当成占位符处理 类似 mybatis 中的 #{}

     

    代码

    一定要主意using 后面的顺序 按照你的sql 的前后顺序来的

     

    我这里 使用了LK_NUMBER 变量 来判断 需要 使用多少的变量 为了区分各种情况把

     

     --过滤掉当前操作人
                       
                -- 过滤不需要返回的人员  属于正则表达式分割
                IF LK_FORWARD_USER IS NOT NULL THEN
                    LK_NUMBER := LK_NUMBER + 4;
                    V_SQL := V_SQL || 'and ub.USER_ID NOT in (
                    SELECT REGEXP_SUBSTR(:LK_FORWARD_USER, ''[^,]+'', 1, ROWNUM) userId
                    FROM DUAL
                    CONNECT BY ROWNUM <=
                               LENGTH(:LK_FORWARD_USER) -
                               LENGTH(REGEXP_REPLACE(:LK_FORWARD_USER, '','', '''')) + 1)';
                end if;
                       
                        --用户ID过滤
                       IF LK_USER_ID IS NOT NULL THEN
                            V_SQL := V_SQL || 'and ub.USER_ID != :LK_USER_ID ';
                        end if;
    
                        --查询ID 过滤
                        IF LK_QUERY_USER_ID IS NOT NULL THEN
                            LK_NUMBER := LK_NUMBER + 1;
                            V_SQL := V_SQL || 'and ub.USER_ID like concat(''%'',concat(:LK_QUERY_USER_ID,''%''))';
                        end if;
                        
                        
                    if LK_NUMBER = 0 then
                        execute immediate V_SQL using LK_USER_ID;
                    elsif LK_NUMBER = 1 then
                        execute immediate V_SQL using LK_USER_ID,LK_QUERY_USER_ID;
                    elsif LK_NUMBER = 4 then
                        EXECUTE immediate V_SQL using LK_FORWARD_USER,LK_FORWARD_USER,LK_FORWARD_USER,LK_USER_ID;
                    elsif LK_NUMBER = 5 then
                        EXECUTE immediate V_SQL using LK_FORWARD_USER,LK_FORWARD_USER,LK_FORWARD_USER,LK_USER_ID,LK_QUERY_USER_ID;
                    end if;
    

    这样就完成了 拼接sql 注入的问题

    展开全文
  • sql中字符串拼接

    千次阅读 2020-08-06 23:59:15
    一、MySQL字符串拼接 1、CONCAT函数 语法bai格式:CONCAT(char c1, char c2, …, char cn) ,其中char代表字符串,定长与不定长均可以 连接两个字符串 select concat(name, show ) from user; 连接多个字符串 ...

    一、MySQL字符串拼接

    1、CONCAT函数

    语法bai格式:CONCAT(char c1, char c2, …, char cn) ,其中char代表字符串,定长与不定长均可以

    连接两个字符串

    select concat(name, show )  from user; 
    

    连接多个字符串

    select concat(name,'aaa', show )  from user; 
    

    2、"+"操作符

    连接两个字符串

    select name + show from user; 
    

    连接多个字符串

    select name + 'aaa' + show from user;
    

    3、假如其中一个字段为NULL,则用结果用空格代替NULL。

    select name + null from user; 
    
    select concat(name, null )  from user; 
    

    二、Oracle字符串拼接

    1、CONCAT函数

    语法格式:CONCAT(char c1, char c2) ,其中char代表字符串,定长与不定长均可以 (与在mysql中的使用方式一样)

    2、"||"操作符(与在mysql中的使用方式一样,只是‘+’变为‘||’)

    3、假如其中一个字段为NULL,则用结果用空格代替NULL。(与mysql中的一样)

    展开全文
  • Oracle中SQL语句连接字符串的符号为|| 代码如下: select catstr(tcdm) || (‘,’) from T_YWCJ_RWCJR where cjrjh=’009846′ and rwid=’12050′ and jsdm=’CJY’ 拼接成一条数据并连接一个”,” 您可能感兴趣的...
  • Oracle 截取字符串拼接字符串

    千次阅读 2019-05-14 11:14:36
    substr(字符串,instr(字符串,'/',-1)+1) 获取字符串中最后一个 "/"后面的数据 字符串1||'_'||字符串2||'_'||字符串3 拼接字符串1+字符串2+字符串3
  • Oracle字符串拼接的方法(||)

    千次阅读 2020-12-23 15:16:35
    select faulttype ||'(1111)'|| nodetype ||'(22222)'|| '('||restype||')' as title from t_kpi_fault
  • Oracle字符串拼接

    千次阅读 2019-01-03 19:37:02
    Oracle中使用“||”进行字符串连接,使用方式如下 ...还可以使用CONCAT()方法进行字符串拼接,注意,CONCAT()方法只支持两个参数 SELECT CONCAT('成绩为',score) FROM TABLE1 T1 WHERE T1.NAME='sout...
  • oracle存储过程使用字符串拼接

    千次阅读 2020-03-27 17:59:26
    Oracle存储过程拼接字符串实例: strSql := 'select * from view_dw_ASSET_SITUATION_O where N_CORPNO='''||CORPCODE||''' and (nvl('''||startTime||''',''-1'') = ''-1'' or IMPORT_DATE >= to_date('''||...
  • SQL字符串拼接

    2020-03-18 13:55:23
    SQL字符串拼接  不同的数据库,相应的字符串拼接方式不同,通过对比加深一下记忆。 一、MySQL字符串拼接  1、CONCAT函数 语法格式:CONCAT(char c1, char c2, ..., char cn) ,其中char代表字符串,定长与...
  • NULL 博文链接:https://czjxdm.iteye.com/blog/466948
  • oracle sql语句中字符串拼接

    千次阅读 2014-08-20 14:26:54
    oracleSQL语句有时候需要将多个字符串拼接成语句,
  • 今天用python的oc_Oracle连接数据库执行了一些sql脚本,有一条语句报"ORA-01756"引号内的字符串没有正确结束的错误,提示分号前的语句没有正确结束,因为我的分号是需要直接拼在字符串里的,谁知道cx_Oracle不转义,...
  • 对于很长的SQL, Java查询数据使用字符串拼接的形式, 如果手动去拼接将十分耗时, 通过下面Java工具类, 可以自动在每行两侧添加双引号, 最后添加分号, 并且SQL中存在注释的位置-- 将会使用Java//注释掉, 这样只要...
  • oracle 字符串拼接数字 ||

    千次阅读 2019-03-26 17:49:19
    现在有一个需求:把字符串中代表日的截取出来,如果小于10就前面拼接一个0;如果大于等于10就不拼接。 这里不说怎么截取字符串,怎么判断,主要说拼接字符串oracle拼接字符串用 ||,字符串也可以和数字拼接。...
  • Oracle与MySQL字符串拼接

    千次阅读 多人点赞 2014-12-10 22:06:02
    一、MySQL在java我们通常用加号"+"来实现字符串拼接,MySQL也可以使用"+"来实现,比如:先加入测试数据CREATE TABLE test( id INT, name VARCHAR(10), score FLOAT ); INSERT INTO test VALUES(1,'zhang',...
  • oracle数据库拼接sql语句字符串问题

    千次阅读 2017-07-12 14:02:03
    近日遇到一个问题,在使用存储过程拼接动态语句时,传输参数一直提示无效标识符,研究发现拼接sql语句的时候,作为字符串参数的变量要加' ',具体代码如下: declare  vc_sql varchar2(20000);   v_table varchar...
  • 在存储过程使用EXECUTE IMMEDIATE或者 OPEN 游标 FOR 的方式执行sql字符串时,对于字符串的控制要妥当。 CREATE OR REPLACE PROCEDURE TEST_20200603( NM_IN VARCHAR; RESULT_CURSOR OUT CURSOR ....... ) IS V_...
  • Oracle拼接字符串

    万次阅读 2019-03-04 18:00:47
    1.使用“||”进行字符串拼接。 select 'a'||'b'||'c' from dual; 'A'||'B'||'C' ---------------- abc 2.使用CONCAT()函数进行字符串拼接。 select concat('a','b') from dual; CONCAT('A'||'B') ---------------...
  • SQL中字符串拼接

    万次阅读 2018-08-16 10:34:59
    1. 概述 2. 数字 + 字符串 ...在SQL语句经常需要进行字符串拼接,以sqlserver,oracle,mysql三种数据库为例,因为这三种数据库具有代表性。 sqlserver: select '123'+'456'; oracle: select '123...
  • Oracle数据库中字符串拼接的实现 select count() from THT_HTFKJL where ht=1; 假如结果为:31、例如上面例子想要给结果拼接字符串有二种实现方法,第一种使用’||’拼接,相当于’+’字符。select ‘第’||count...
  • oracle同一列字符串拼接

    千次阅读 2017-06-27 14:42:14
    老版本可以使用wm_concatselect wm_concat(name) from tbname ;11gr2可以使用listaggselect listagg(name,',') within group(order by name) from tbname ;
  • ORACLE字符串拼接(多行并一行)

    千次阅读 2020-07-28 19:13:37
    --方法1 SELECT wm_concat(USER_NAME) FROM SYS_USER A ,SYS_USER_DATA_PERMISSION B WHERE B.USER_CODE=A.USER_NAME AND B.ATTR='WHS' AND B.VALUE='T51W' --方法2 SELECT listagg (A.USER_NAME, ',') WITHIN ...
  • Oracle字符串拼接的方法

    千次阅读 2018-08-11 14:13:39
    和其他数据库系统类似,Oracle字符串连接使用“||”进行字符串拼接,其使用方式和MSSQLServer的加号“+”一样。 比如执行下面的SQL语句: 复制代码代码如下:   SELECT '工号为'||FNumber||'的员工姓名为'||...
  • Oracle拼接字符串的两种方式

    千次阅读 2019-01-25 17:34:17
     该方法拼接后是varchar2类型,有最大长度限制,在Oracle Database,VARCHAR2 字段类型,最大值为4000;PL/SQL中 VARCHAR2 变量类型,最大字节长度为32767。  适用场景:当要拼接字符较少时使用。 select '...
  • Oracle 分组拼接字符串

    2021-04-17 22:02:44
    oracle 根据分组拼接字符串,以指定分隔符分割,有两种方式 1)第一种方式,使用 listagg 函数 例子如下: select field1, field2,listagg(field,seperator) within group(order by sortFiled) group by field1, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,459
精华内容 6,583
关键字:

oracle中sql字符串拼接