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)),
该怎么办呢?

解决方案 »

  1.   

    只能修改下面的selectOK!测试通过了。试试吧。觉得好就多加点分 exec decord_a '1a@b2@c3@e4@f5' 
    ---这个存储过程可以提取包含任意个@字符的字符串,通过临时表输出,使用查询分析器或前台数据集都可以得到结果。 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
      

  2.   

    -------------------------
    您好!我用的是Oracle数据库,只是喜欢在Sqlserver板块问问题^_^
      

  3.   

    我想传多个id进来,返回多个父id,如何可以做到呢?修改函数也可以,请问怎么做出来呢?id个数是不确定的,返回值的话,可以返回多个值么请问?是不是我的思路有问题呢?
      

  4.   

    那倒不如不用存储过程
    直接用SQL语句返回记录集
      

  5.   

    存储过程的思路是什么呢?是Oracle的数据库
      

  6.   

    传'''1001'',''1002'',''1003'''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 ;
      

  7.   

    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 CHARINDEX(''''+C_ID+'''',V_CIDS)>0
      ) A;
      RETURN Result;END GET_PARENT_IDS ;
    SELECT GET_PARENT_IDS ('''1001'',''1002'',''1003''')
      

  8.   

    SqlServer礼的CHARINDEX,要用Oracle里的哪个函数替换呢?在baidu上搜的是:
    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要用哪个呢,谢谢!
      

  9.   

    为什么不把这些ID放在一个临时表里面 
    然后 SELECT PID FROM TABLE1 WHERE CID (select 你要返回的字段 from 临时表) 
    我感觉是思路问题 
    你看我这样的解决方法是不是很好
      

  10.   

    可以把传进来的参数放进一个临时表里再做比较,有点麻烦,也可以通过游标来实现,同样麻烦:
    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;