CREATE OR REPLACE FUNCTION GET_PARENT_IDS (V_CIDS VARCHAR2)
我想问一下就是这个函数里定义一个参数,可是我传递参数的时候,ID的个数是不确定的,请问能把传递的参数作为一个字符串传进来么?
函数是这样的:CREATE OR REPLACE FUNCTION GET_PARENT_IDS (V_CIDS VARCHAR2)
RETURN VARCHAR2 IS
Result VARCHAR2(10000);
BEGIN
SELECT A.P_ID INTO Result FROM (
SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (V_CIDS)
) A;
RETURN Result;END GET_PARENT_IDS ;SELECT GET_P_IDS(1001) FROM DUAL,返回的是它的父节点 2000,
如果我传两个参数或更多的话:SELECT GET_PARENT_IDS(1001,1002) FROM DUAL 那么报错:参数个数不对
如果我传'1001,1002', SELECT GET_PARENT_IDS('1001,1002') FROM DUAL 那么报错:无效数字(在这行:SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (V_CIDS))(因为这样就成了: SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN ('1001,1002') 了,想得到 :SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (1001,1002)),
该怎么办呢?
我想问一下就是这个函数里定义一个参数,可是我传递参数的时候,ID的个数是不确定的,请问能把传递的参数作为一个字符串传进来么?
函数是这样的:CREATE OR REPLACE FUNCTION GET_PARENT_IDS (V_CIDS VARCHAR2)
RETURN VARCHAR2 IS
Result VARCHAR2(10000);
BEGIN
SELECT A.P_ID INTO Result FROM (
SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (V_CIDS)
) A;
RETURN Result;END GET_PARENT_IDS ;SELECT GET_P_IDS(1001) FROM DUAL,返回的是它的父节点 2000,
如果我传两个参数或更多的话:SELECT GET_PARENT_IDS(1001,1002) FROM DUAL 那么报错:参数个数不对
如果我传'1001,1002', SELECT GET_PARENT_IDS('1001,1002') FROM DUAL 那么报错:无效数字(在这行:SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (V_CIDS))(因为这样就成了: SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN ('1001,1002') 了,想得到 :SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (1001,1002)),
该怎么办呢?
---这个存储过程可以提取包含任意个@字符的字符串,通过临时表输出,使用查询分析器或前台数据集都可以得到结果。 create procedure decord_A
@STR VARCHAR(100)
AS
declare @n int,@SN INT
SET @N=LEN(@STR)-LEN(REPLACE(@STR,'@',''))--提取字符@的个数
SET @SN=1
CREATE table #TEMP(SN INT,CSTR VARCHAR(100))
WHILE @SN<=@N
BEGIN
INSERT INTO #TEMP SELECT @SN,LEFT(@STR,CHARINDEX('@',@STR)-1)
SELECT @SN=@SN+1,@STR=SUBSTRING(@STR,CHARINDEX('@',@STR)+1,100)
END
INSERT INTO #TEMP SELECT @N+1,@STR
SELECT *FROM #TEMP order by sn
GO
您好!我用的是Oracle数据库,只是喜欢在Sqlserver板块问问题^_^
直接用SQL语句返回记录集
RETURN VARCHAR2 IS
Result VARCHAR2(10000);
BEGIN
SELECT A.P_ID INTO Result FROM (
SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN (V_CIDS)
) A;
RETURN Result;END GET_PARENT_IDS ;
RETURN VARCHAR2 IS
Result VARCHAR2(10000);
BEGIN
SELECT A.P_ID INTO Result FROM (
SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE CHARINDEX(''''+C_ID+'''',V_CIDS)>0
) A;
RETURN Result;END GET_PARENT_IDS ;
SELECT GET_PARENT_IDS ('''1001'',''1002'',''1003''')
instr(str,chr) ---chr在str中第1次出现的位置
instr(str,chr,3,2) ---从str第3个字符位置开始搜索chr在str中第2次出现的位置
instr(str,chr,-3,2) ---从str的从右向左数第3个字符位置开始反向搜索chr在str中第2次出现的位置 INSTR(c1,c2[,<i>[,j]])
c1,c2均为字符串,i,j为整数。函数返回c2在c1中第j次出现的位置,搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数,那么搜索将从右到左进行,但是位置的计算还是从左到右,i和j的缺省值为1.
select INSTR('Mississippi','i',3,3) from dual
INSTR('MISSISSIPPI','I',3,3)
11
select INSTR('Mississippi','i',-2,3) from dual
INSTR('MISSISSIPPI','I',-2,3)
2要用哪个呢,谢谢!
然后 SELECT PID FROM TABLE1 WHERE CID (select 你要返回的字段 from 临时表)
我感觉是思路问题
你看我这样的解决方法是不是很好
declare @i int
declare @j intset @i = 0
set @j = 0set @j = charindex(',',V_CIDS,@i)DECLARE @tabcid TABLE (ID int identity(1,1),cid varchar(20))--中间没有逗号的情况
if @j = 0
begin
insert into @tabcid values(V_CIDS)
end
--有多个逗号的情况
while @j>0
begin
insert into @tabcid(cid) values(substring(V_CIDS,@i,@j-@i))
set @i = @j+1
set @j = charindex(',',V_CIDS,@i)
end
--插入最后一个字符
if @i>0
begin
insert into @tabcid(cid) values(substring(V_CIDS,@i,len(V_CIDS)-@i+1))
endSELECT A.P_ID INTO Result FROM (
SELECT TO_CHAR(PID) PID FROM RES_TABLE WHERE C_ID IN ( select cid from @tabcid)
) A;