问题描述:
1.通过一条sql
select menu_ids from ACTION_ROLE where action_role_id=1
查询出menu_ids 的值为  1,5,6,45,46  其数据类型为varchar2(1000)
2.下面一条sql语句需要用到数值类型的1,5,6,45,46.语句如下:
select *from ZSYWYJ.QD_QX_MENU where menu_id in (?)问题:现在需要将通过编号为1的sql查出来的varchar2(1000)类型的 1,5,6,45,46 传进编号为2的sql
的问号部分,注意编号2 sql 的menu_id为number类型本问提的核心是,如何将varchar2类型的1,5,6,45,46转换成用逗号分开的数值型1,5,6,45,46

解决方案 »

  1.   

    问题描述补充:
    或者说,本问题的核心是如何将
    varchar2 类型的1,5,6,45,46 
    表达式化
      

  2.   


    使用exectue immediate的方法。
    主体语句如下:
    begin
     execute immediate 'select *from ZSYWYJ.QD_QX_MENU where menu_id in ('||你编号1得到的字符串||')';
    end;
      

  3.   

    如果menu_id为number类型,楼上的方法可以的。 因为如果menu_id为varchar类型,那么相应的数值应该是:select *from ZSYWYJ.QD_QX_MENU where menu_id in ('1','5','6','45','46');
      

  4.   

    感谢2楼3楼的回答!!!利用 exectue immediate
    可以通过程序传进数据库执行吗?如何传进数据库
    java的jdbc可以传exectue immediate吗?
      

  5.   

    改一下思路!给一个例子:SQL> desc a_file
    Name Type         Nullable Default Comments 
    ---- ------------ -------- ------- -------- 
    A01  INTEGER      Y                         
    A02  INTEGER      Y                         
    A03  NVARCHAR2(2) Y                         SQL> desc b_file
    Name Type        Nullable Default Comments 
    ---- ----------- -------- ------- -------- 
    B01  INTEGER     Y                         
    B02  INTEGER     Y                         
    B03  VARCHAR2(1) Y              看一下表A03和B02字段,一个是字符一个是数值A_file 数值:
    1 1 11 11
    2 2 12 12
    3 3 13 13
    4 4 14 14
    5 5 15 15
    6 6 16 16
    7 7 17 17
    8 8 18 18
    9 9 19 19
    10 10 20 20B_file :
    1 111 11 0
    2 212 12 0
    3 313 13 0
    4 414 14 0
    5 515 15 0
    现在看选择语句
    select * from a_file where a03 in(select b02 from b_file)子这里的A03是NVARCHAR(2)  而b02是INT,系统可以自动转换!结果如下:1 1 11 11
    2 2 12 12
    3 3 13 13
    4 4 14 14
    5 5 15 15你上面的就可以直接用语句写出来!select *from ZSYWYJ.QD_QX_MENU where menu_id in (select menu_ids from ACTION_ROLE where action_role_id=1 ) 
      

  6.   

    select *from ZSYWYJ.QD_QX_MENU where menu_id in (select menu_ids from ACTION_ROLE where action_role_id=1)
    这样就可以了,但可能执行速度有点慢 
      

  7.   

    select *from ZSYWYJ.QD_QX_MENU 
    where instr(','||'1,5,6,45,46'||',', ','||to_char(menu_id)||',' )>0