Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Oracle Dynamic sql:使用撇号值更新列

Oracle Dynamic sql:使用撇号值更新列
EN

Stack Overflow用户
提问于 2019-12-07 12:35:49
回答 1查看 408关注 0票数 0

我正在尝试使用动态查询来更新列。更新值有一个撇号(中华人民共和国~ THE)。我得到了下面的错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*Example Table Data*/
CREATE TABLE CUST_DATA
  (
  ID number,
  LEGAL_ENTIRY_ID   VARCHAR2(50),
  CUST_ID           VARCHAR2(50),
  CUST_NAME         VARCHAR2(50)
  );
INSERT INTO CUST_DATA VALUES(1,'ICC02','CH001','TEST123');
INSERT INTO CUST_DATA VALUES(1,'ICC02','LN001','TEST456');
/
CREATE TABLE RR1
  (
  ID                VARCHAR2(50),
  ADJUSTMENT_VALUE  VARCHAR2(50)
  );
INSERT INTO RR1 VALUES('CH001',q'[PEOPLE'S REPUBLIC OF CHINA~ THE]');
INSERT INTO RR1 VALUES('IN001','REPUBLIC OF INDIA');
INSERT INTO RR1 VALUES('US001','USA');
INSERT INTO RR1 VALUES('RU001','RUSSIA');
/
COMMIT;

/*PLSQL Block*/
DECLARE
TYPE T_VARCHAR  IS TABLE OF VARCHAR2(50);
V_CUST_ID       T_VARCHAR;
V_ADJ_VALUE   T_VARCHAR;
V_TABLE_NAME    VARCHAR2(30);
V_SQL             VARCHAR2(100);
BEGIN
    SELECT ID,ADJUSTMENT_VALUE BULK COLLECT INTO V_CUST_ID,V_ADJ_VALUE FROM RR1 ORDER BY ID;
    V_TABLE_NAME    := 'CUST_DATA';
    FOR I IN 1 .. V_CUST_ID.COUNT LOOP
        V_SQL := 'UPDATE '||DBMS_ASSERT.SQL_OBJECT_NAME(V_TABLE_NAME)||
                   ' SET CUST_NAME = '||DBMS_ASSERT.ENQUOTE_LITERAL(V_ADJ_VALUE(I))||
                 ' WHERE CUST_ID = '||DBMS_ASSERT.ENQUOTE_LITERAL(V_CUST_ID(I));
        DBMS_OUTPUT.PUT_LINE('V_SQL -->'||V_SQL);
        EXECUTE IMMEDIATE V_SQL;
    END LOOP;
    COMMIT;
    EXCEPTION WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('ERROR -->'||SQLERRM||' / '||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;

ERROR -->ORA-06502: PL/SQL: numeric or value error / ORA-06512: at "SYS.DBMS_ASSERT", line 342
ORA-06512: at "SYS.DBMS_ASSERT", line 411
ORA-06512: at line 11

'CUST_NAME‘栏目正在更新为“中华人民共和国~ THE”。请让我知道是否有解决此问题的方法??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 12:45:24

使用绑定变量,那么你的所有问题就解决了(包括。更好的性能和SQL注入的风险):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
V_SQL := 'UPDATE '||DBMS_ASSERT.SQL_OBJECT_NAME(V_TABLE_NAME)||
        ' SET CUST_NAME = :CustName '||
        ' WHERE CUST_ID = :CustId';
EXECUTE IMMEDIATE V_SQL USING V_ADJ_VALUE(I), V_CUST_ID(I);

对于非动态语句,您还可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO RR1 VALUES('CH001','PEOPLE''S REPUBLIC OF CHINA~ THE');

我不是100%确定(即我没有测试它),但你可以在一条语句中运行更新,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE
   TYPE T_ADJUSTMENT_REC IS RECORD (
      ID RR1.ID%TYPE,
      ADJUSTMENT_VALUE RR1.ADJUSTMENT_VALUE%TYPE );
   TYPE T_ADJUSTMENT_TYPE IS TABLE OF T_ADJUSTMENT_REC ;
   T_ADJUSTMENT T_ADJUSTMENT_TYPE;

   V_TABLE_NAME    VARCHAR2(30);
   V_SQL             VARCHAR2(100);

BEGIN

   SELECT T_ADJUSTMENT_REC(ID,ADJUSTMENT_VALUE) 
   BULK COLLECT INTO T_ADJUSTMENT 
   FROM RR1 ORDER BY ID;
   V_TABLE_NAME    := 'CUST_DATA';

   V_SQL := 'UPDATE (SELECT CUST_NAME, CUST_ID, ADJUSTMENT_VALUE FROM '||V_TABLE_NAME||
           ' JOIN TABLE(:t) ON ID = CUST_ID) SET CUST_NAME = ADJUSTMENT_VALUE';

   EXECUTE IMMEDIATE V_SQL USING T_ADJUSTMENT;

END;

也许还有一种使用FORALL的解决方案,我从未在dynamic SQL中使用过FORALL (使用绑定变量)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59226024

复制
相关文章
ORACLE列值合併
在SQL Server中合併列值能够使用For Xml Path,在Oracle中則能够使用wm_concat 或 ListAgg。
全栈程序员站长
2022/07/13
1.1K0
MySQL timestamp类型列值自动更新
MySQL中使用timestamp定义字段,默认情况下会给字段添加自动更新的属性,本文将分析这个自动更新的设置。 问题概述 一个表中定义了两个timestamp类型的字段, create_time TIMESTAMP NOT NULL COMMENT '创建时间', update_time TIMESTAMP NOT NULL COMMENT '更新时间' 新插入记录时,给create_time和update_time各自赋予当前时间值,没出现问题。更新记录时代码中只更新update_time,结果cre
JavaQ
2018/04/04
3.8K0
Oracle运算符
单引号(’): 在Oracle中,应该只运用单引号将文本和字符和日期括起来,不能运用引号(包括单双引号)将数字括起来。 双引号(”): 在Oracle中,单双引号意思不同。双引号被用来将包含特定字符或者空格的列别名括起来。双引号还被用来将文本放入日期格式。 撇号(’): 在Oracle中,撇号也可以写成彼此相邻的两个单引号。为了在供应商名字中间查找所有带撇号的供应商名字,可以这样编写代码:select * from l_suppliers where supplier_name like ‘%”%’ &符号: 在Oracle中,&符号常用来指出一个变量。例如,&fox是一个变量,稍微有点不同的一种&& fox.每当&fox出现在Oracle脚本中时,都会要求您为它提供一个值。而运用 &&fox,您只须要在& &fox第一次出现时为它提供变量值。如果想将&符号作为普通的符号运用,则应该关上这个特征。要想关上这个特征,可以运行以下的命令: set define off ,这是一个SQLplus命令,不是一个SQL命令。SQLplus配置了SQL在Oracle中运行的环境。 双竖线(): Oracle运用双竖线表示字符串连接函数。 星号(*): select *意味着选择所有的列,count(*)意味着计算所有的行,表示通配符时,表示0个或任意多个字符。 正斜杠(/): 在Oracle中,用来终止SQL语句。更准确的说,是表示了“运行现在位于缓冲区的SQL代码”。正斜杠也用作分隔项。 多行注释: /* */ 不等于: 有多种表达方式: !=、^=、<>、not xxx=yyy、not(xxx=yyy)
全栈程序员站长
2022/07/05
6410
Mysql与Oracle中修改列的默认值
背景: 业务发展需要,需要复用历史的表,并且通过表里面原来一个未使用的字段来区分不同的业务。 于是想到通过default来修改列的默认值: alter table A modify column biz default 'old' comment '业务标识 old-老业务, new-新业务' 现象: 上线几天之后,业务反馈旧业务的相关数据查询不到了。找后台运维查生产数据库,发现历史数据的biz字段还是null 原因: 自己在本地mysql数据库试了下,好像的确是default没法修改历史数据为null
SecondWorld
2021/09/08
13.2K0
oracle的行转列和列转行_sql中行转列
--============================================== 作者:王运亮(wwwwgou) 时间:2011-06-10 博客:http://blog.csdn.net/wwwwgou --==============================================
Java架构师必看
2022/05/26
3.9K0
SQL 求 3 列异值的 4 种方法
回想往事,其实有好些想法,可以深究,因没及时记录,事后就再也想不起来,白白浪费好多这样的机会。
Lenis
2022/03/31
2.6K0
SQL 求 3 列异值的 4 种方法
SQL练习之两个列值的交换
SELECT * FROM dbo.test2 现在我们将Province列值和Company列值互换,代码如下: UPDATE test2 SET Company=Province, Provin
郑小超.
2018/01/24
3.5K0
SQL练习之两个列值的交换
使用Oracle SQL Developer 连接SQL Server
上次,将MySQL数据迁移到Oracle介绍了如何使用oracle sql developer连接mysql。同样,sql server的连接也比较相似。
williamwong
2018/07/24
3.3K0
使用Oracle SQL Developer 连接SQL Server
Oracle列转行函数vm_concat使用
今天需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)…这种格式。这就想到oracle的列转行函数vm_concat。 可以用类似这种格式wm_concat(a || ‘(’ || b || ‘)’),a表示用户名字段,b表示账号字段。 例子:
SmileNicky
2019/01/17
5.9K0
Oracle使用SQL分析锁
      可以利用SQL脚本检查实例中当前锁定情况。在数据库中第一次执行任何与锁定有关的SQL脚本之前,都需要首先运行catblock.sql脚本,该脚本位于$Oracle_HOME/rdbms/admin目录下。运行此脚本将创建几个与锁定有关的重要视图,如DBA_LOCKS、DBA_WAITERS、DBA_BLOCKERS等。
星哥玩云
2022/08/18
4070
Oracle SQL*Loader 使用简介
前面一文简单介绍了 Oracle 大数据量导出工具——sqluldr2 的安装与使用,sqluldr2 的诞生主要是用于将大批量的 Oracle 数据快速导出成 CSV/Text 文本格式,方便导入到其他数据库中,如今国产化进行的如火如荼,这个工具也是在国产数据库迁移中使用比较广泛的工具,值得大家去学习与使用,今天要说的是 Oracle 数据库自带的数据导入工具 SQL*Loader(sqlldr),只要你安装了 Oracle 数据库,那么这个工具就存在于 ORACLE_HOME/bin 目录下,它的功能是将从其他数据库中导出的 DAT/CSV/Text 文件加载到 Oracle 数据库中。数据泵导入需要 dmp 文件才可以,执行 insert 语句插入需要 .sql 文件才行,当然外部表的形式也可以,但外部表没法编辑且文件位于数据库外,不能 update 编辑数据则考虑 sqlldr 直接加载到 Oracle 数据库中更为方便。
JiekeXu之路
2023/09/06
6810
Oracle SQL*Loader 使用简介
sql列转行
--用于:交叉表的列数是不确定的 declare @sql varchar(8000)
Java架构师必看
2021/03/22
9410
使用EXCLE表格,有相同列,取某一列的值
如图,我有两列MAC地址表,然后需要把F列的值取值到D列,可以使用公式:=VLOOKUP(A1,$E$1:$F$44,2,0)进行处理数据。A1代表以哪一列为基础取值参考,$E$1:$F$44代表查找对比范围。
Tacc
2022/01/11
4.3K0
使用EXCLE表格,有相同列,取某一列的值
如何使用python连接MySQL表的列值?
MySQL 是一个开源关系数据库管理系统,广泛用于存储、管理和组织数据。使用 MySQL 表时,通常需要将多个列值组合成一个字符串以进行报告和分析。Python是一种高级编程语言,提供了多个库,可以连接到MySQL数据库和执行SQL查询。
很酷的站长
2023/08/11
2460
如何使用python连接MySQL表的列值?
listagg oracle10_oracle伪列
工作中经常遇到很多需求是这样的,根据条件汇总某些字段,比如我遇到的是,我们公司有三个投资平台,同一个客户拿手机号在三个平台都注册了,但注册过的用户名不一样,显示的时候需要根据手机号显示所有注册过的名称。(我用的是oracle数据库)
全栈程序员站长
2022/10/04
4150
listagg oracle10_oracle伪列
大战SQL列类型及其列属性
最近,在看一本《原则》的书籍,是写的一位美国人投资史。其中谈到和他的创业伙伴关系出现裂缝时,我们会怎样做?
小Bob来啦
2020/12/08
1.3K0
大战SQL列类型及其列属性
Oracle使用SQL传输表空间
源环境:RHEL 6.4 + Oracle 11.2.0.4 目的环境:RHEL 6.4 + Oracle 11.2.0.4 DG双机 要求:使用SQL传输表空间DBS_D_JINGYU从源环境到目的环境。
Alfred Zhao
2022/05/06
3810
Pandas 查找,丢弃列值唯一的列
数据清洗很重要,本文演示如何使用 Python Pandas 来查找和丢弃 DataFrame 中列值唯一的列,简言之,就是某列的数值除空值外,全都是一样的,比如:全0,全1,或者全部都是一样的字符串如:已支付,已支付,已支付…
萝 卜
2022/05/12
5.7K0
Pandas 查找,丢弃列值唯一的列
点击加载更多

相似问题

Oracle SQL添加撇号

33

SQL撇号

31

导致SQL更新失败的撇号

32

用于列的Oracle Dynamic SQL

30

撇号动态SQL

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文