ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 660|回复: 12

动态sql报错,

[复制链接]
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
发表于 2017-4-20 13:08 | 显示全部楼层 |阅读模式
遇到一个动态sql,多一个and条件就报错,去掉后就没有问题。
对比了半天也没有发现哪里有问题,请各位给看下。

create table TEST1
( DRAW_ID   NUMBER not null,
  TICKET_NO VARCHAR2(30) not null,
  PASSWORD  VARCHAR2(40) not null,
  PAID_TYPE NUMBER,
  CLERK_ID  NUMBER
);

insert into test1 (DRAW_ID, TICKET_NO, PASSWORD, PAID_TYPE, CLERK_ID)
values (32108, '006850214210098015645', '3f9,XzvsiGrsC4sRMWzdG3IJinv4', null, 1);
insert into test1 (DRAW_ID, TICKET_NO, PASSWORD, PAID_TYPE, CLERK_ID)
values (32108, '006850214210098015645', '3f9,XzvsiGrsC4sRMWzdG3IJinv4', null, 1);


--报错
DECLARE
  v_paid_type           NUMBER;
  v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';
BEGIN
  EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0)
       FROM test1
       WHERE draw_id in (' || v_temp_paid_draw_list || ' )
          AND ticket_no = ' || p_ticket_no || '
           AND password =  ' || p_password || '
        GROUP BY clerk_id, nvl(paid_type, 0) '
    INTO v_paid_type;
  dbms_output.put_line(v_paid_type);
END;



--去掉一个and条件后,就不报错,
DECLARE
  v_paid_type           NUMBER;
  v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';

BEGIN
  EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0)
       FROM test1
       WHERE draw_id in (' || v_temp_paid_draw_list || ' )
          AND ticket_no = ' || p_ticket_no || '
        GROUP BY clerk_id, nvl(paid_type, 0) '
    INTO v_paid_type;
  dbms_output.put_line(v_paid_type);

END;




论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-4-20 13:11 | 显示全部楼层
为什么不用绑定变量

使用道具 举报

回复
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2017-4-20 13:28 | 显示全部楼层
〇〇 发表于 2017-4-20 13:11
为什么不用绑定变量

绑定变量,也是报错,类型错误

DECLARE
  v_paid_type           NUMBER;
  v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';
BEGIN
  EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0) FROM test1 WHERE draw_id in (:1)
          AND ticket_no =:2
           AND password =:3  
        GROUP BY clerk_id, nvl(paid_type, 0)'
    INTO v_paid_type
    USING v_temp_paid_draw_list, p_ticket_no, p_password;
  dbms_output.put_line(v_paid_type);
END;

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-4-20 13:28 | 显示全部楼层
字符类型常量要用''转义的单引号包围
SQL> DECLARE
  2    v_paid_type           NUMBER;
  3    v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  4    p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  5    p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';
  6  BEGIN
  7    EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0)
  8         FROM test1
  9         WHERE draw_id in (' || v_temp_paid_draw_list || ' )
10            AND ticket_no = ' || p_ticket_no || '
11             AND password =  ' || p_password || '
12          GROUP BY clerk_id, nvl(paid_type, 0) '
13      INTO v_paid_type;
14    dbms_output.put_line(v_paid_type);
15  END;
16  /
DECLARE
*
第第 1 行行出出现现错错误误:
ORA-00933: SQL 命命令令未未正正确确结结束束
ORA-06512: 在在 line 7


SQL> DECLARE
  2    v_paid_type           NUMBER;
  3    v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  4    p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  5    p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';
  6  BEGIN
  7    EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0)
  8         FROM test1
  9         WHERE draw_id in (' || v_temp_paid_draw_list || ' )
10            AND ticket_no = ' || p_ticket_no || '
11             AND password =  ''' || p_password || '''
12          GROUP BY clerk_id, nvl(paid_type, 0) '
13      INTO v_paid_type;
14    dbms_output.put_line(v_paid_type);
15  END;
16  /

PL/SQL 过过程程已已成成功功完完成成。。

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-4-20 13:31 | 显示全部楼层
只要你的值里有字符,你的第2句照样出错

SQL> update test1 set ticket_no='a'||ticket_no;

已已更更新新2行行。。

SQL> DECLARE
  2    v_paid_type           NUMBER;
  3    v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  4    p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  5    p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';
  6
  7  BEGIN
  8    EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0)
  9         FROM test1
10         WHERE draw_id in (' || v_temp_paid_draw_list || ' )
11            AND ticket_no = ' || p_ticket_no || '
12          GROUP BY clerk_id, nvl(paid_type, 0) '
13      INTO v_paid_type;
14    dbms_output.put_line(v_paid_type);
15
16  END;
17  /
DECLARE
*
第第 1 行行出出现现错错误误:
ORA-01722: 无无效效数数字字
ORA-06512: 在在 line 8

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-4-20 13:33 | 显示全部楼层
绑定变量不能把逗号分隔字符串转化成值列表

使用道具 举报

回复
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
 楼主| 发表于 2017-4-20 13:38 | 显示全部楼层
〇〇 发表于 2017-4-20 13:33
绑定变量不能把逗号分隔字符串转化成值列表

谢谢版主,占用休息时间给解答问题,

长知识了。谢谢~!  

使用道具 举报

回复
认证徽章
论坛徽章:
203
2010新春纪念徽章
日期:2010-03-01 11:20:51至尊黑钻
日期:2015-08-13 13:38:12至尊黑钻
日期:2015-02-15 09:47:472015中国数据库技术大会纪念徽章
日期:2015-05-15 14:08:23管理团队2007贡献徽章
日期:2015-01-19 09:48:272015年中国系统架构师大会纪念徽章
日期:2015-07-31 17:48:20红宝石
日期:2015-01-19 09:42:28红宝石
日期:2017-04-21 09:23:38海蓝宝石
日期:2015-02-03 10:23:39红宝石
日期:2015-02-03 10:26:04
发表于 2017-4-20 13:39 | 显示全部楼层
  1. DECLARE
  2.   v_paid_type           NUMBER;
  3.   v_temp_paid_draw_list VARCHAR2(320) := '32108,79253,79254';
  4.   p_ticket_no           VARCHAR2(320) := '006850214210098015645';
  5.   p_password            VARCHAR2(320) := '3f9,XzvsiGrsC4sRMWzdG3IJinv4';
  6. BEGIN
  7.   EXECUTE IMMEDIATE 'SELECT nvl(paid_type, 0)
  8.        FROM test1
  9.        WHERE draw_id in (' || v_temp_paid_draw_list || ' )
  10.           AND ticket_no = ''' || p_ticket_no || '''
  11.            AND password =  ''' || p_password || '''
  12.         GROUP BY clerk_id, nvl(paid_type, 0) '
  13.     INTO v_paid_type;
  14.   dbms_output.put_line(v_paid_type);
  15. END;
复制代码

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07
发表于 2017-4-20 14:10 | 显示全部楼层
〇〇 发表于 2017-4-20 13:33
绑定变量不能把逗号分隔字符串转化成值列表

20170419102902434.jpg 来自http://dbaplus.cn/news-21-1177-1.html

使用道具 举报

回复
论坛徽章:
481
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-4-21 01:52 | 显示全部楼层
〇〇 发表于 2017-4-20 14:10
来自http://dbaplus.cn/news-21-1177-1.html

有点笨,要写好多个CASE WHEN,应该用DBMS_SQL, 循环绑定。也不一定要变成UNION ALL。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票8.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月30日前

活动链接>>
TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表