壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4242|回复: 12

请问一个PL/SQL参数问题,急。。。

[复制链接]
发表于 2007/7/27 09:09:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
现在有一参数PNO='111,1112,113,114'
我是将这个参数传入一SQL中
SELECT * FROM TB WHERE ID IN (PNO)
这样写好像不行,会报一个“致命性双通道”错误
其实这样写确实不对
这样SQL就变成:SELECT * FROM TB WHERE ID IN ('111,1112,113,114')
而真正的SQL应该是
SELECT * FROM TB WHERE ID IN (111,1112,113,114)

SELECT * FROM TB WHERE ID IN ('111','112','113','114')

请问高手如何实现呀,先谢了
发表于 2007/7/27 09:33:34 | 显示全部楼层
这估计要用动态SQL语句才行吧,你这样当然不行
发表于 2007/7/27 09:35:31 | 显示全部楼层
按楼主所说的意思是从一个字符中裁取子串出来作为参数,这个需要另写一个函数,将PNO按遇''','裁取出子串,分别取完之后,再传至SQL
发表于 2007/7/27 09:39:59 | 显示全部楼层
首先想問一下你具體的需求,你是要做在哪裏呢,D2K, 還是只是在PL/SQL DEVELOPER 中下參數查找呢??????/
 楼主| 发表于 2007/7/27 09:44:05 | 显示全部楼层
我是在写一个FROM, 用的是FORM BUILDER6。0
数据源用的是PKG,这个参数是要传到PKG里面去的
发表于 2007/7/27 10:05:23 | 显示全部楼层
剛給你寫了一個REPORT的例子,你自己把它看看吧.傳到 PKG裏面應該也差不多的,

參數就用 60, 128,526,1212 這樣的形式!!!

tst_1.rar

8.93 KB, 下载次数: 14, 下载积分: 努力值 -5 点

tst_1.rar

8.93 KB, 下载次数: 7, 下载积分: 努力值 -5 点

发表于 2007/7/27 10:40:21 | 显示全部楼层
曾做过测试,Report上是可以这么搞的,但是在PL/SQL上不行
发表于 2007/7/27 10:56:58 | 显示全部楼层

可以用sql table type

一下子没有找到sample, 只能给个提示了, asktom的网站上是有的.
1. create type tt is table of number;
2.
create function tf (p_str IN VARCHAR2) return tt is
   l_t    tt;
   i        number := 0;
   a       number;
begin
   loop
      i := i + 1;
      a:=get_id(p_str,i); --- 一次读取string里的一个列, 一下子找不到这个get_id function了
   exit when a is null;   --取到最后一个就退出.
      l_t.extend;
      l_t(i) :=  a;
   end loop;
   return l_t;
end;
/

3. select * from fnd_user
where user_id in (select * from table(cast(tf('111,222,333') as tt)));
发表于 2007/7/27 11:54:42 | 显示全部楼层
他是要在FORM裏面實現的,FORM裏面自定用戶參數再傳PROC呢?
发表于 2007/7/27 12:07:47 | 显示全部楼层
PL/SQL 裏面這樣寫也完全沒有問題的哦,
]不過對摟主的問題麽有幫助:zhuany:0)

select msi.segment1, msi.description,msi.inventory_item_id
  from mtl_system_items msi
where msi.organization_id = 2
   and msi.inventory_item_id in &xx

參數  (60, 128,526,1212)
发表于 2007/7/27 16:44:21 | 显示全部楼层
试试嵌入式SQL吧!

Example:
DECLARE

V1 VARCHAR2(100)    :=   'GUEST,ORACLE,SYSADMIN,SYS';
V2 VARCHAR2(100);
lv_sql_stmt VARCHAR(1000);

BEGIN

V1 := '(''' || V1 || ''')';
select replace(V1,',',''',''') INTO V2 from dual;

DBMS_OUTPUT.PUT_LINE(V2);

LV_SQL_STMT := 'SELECT USERNAME FROM ALL_USERS WHERE USERNAME IN ' || V2 || ' AND ROWNUM=1';


DBMS_OUTPUT.PUT_LINE(lv_sql_stmt);

EXECUTE IMMEDIATE lv_sql_stmt into V1;

DBMS_OUTPUT.PUT_LINE(V1);

END;

执行后OUTPUT,如下:
('GUEST','ORACLE','SYSADMIN','SYS')
SELECT USERNAME FROM ALL_USERS WHERE USERNAME IN ('GUEST','ORACLE','SYSADMIN','SYS') AND ROWNUM=1
SYS
发表于 2007/7/27 18:41:58 | 显示全部楼层

更简单的方法

用INSTR函数,例子如下:

DECLARE

V1 VARCHAR2(100)    :=   'GUEST,ORACLE,SYSADMIN,SYS';
V2 VARCHAR2(100);

BEGIN

V2 := ','||V1||',';

DBMS_OUTPUT.PUT_LINE(V2);

SELECT USERNAME into V1 FROM ALL_USERS WHERE instr(V2,','||USERNAME||',')>0;

DBMS_OUTPUT.PUT_LINE(V1);

END;

我们用这种方法在一个参数中输入多张单据号码,通过一个Request同时打印。
 楼主| 发表于 2007/7/30 16:15:08 | 显示全部楼层
用了“renzhek”兄弟的方二,程序基本搞定,非常感谢各位,谢谢你们!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 15:22 , Processed in 0.015727 second(s), 18 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表