各位大侠好:
本人一个小问题处理不了,请求支援:
一个sql的存储过程怎么转化为ORACLE的存储过程呢;
下边是sql的
GSP_DEP_VALUEMAPPINGSET--存储过程名称
DEPVMTARCOLVALUE--表名
CREATE PROC GSP_DEP_VALUEMAPPINGSET   
@VMID   VARCHAR (36)   
AS  
BEGIN  
    DECLARE @SQL VARCHAR(8000)   
 SET @SQL = 'SELECT TARGETID ,DEPVMTARCOLVALUE.VALUE'  
 SELECT @SQL = @SQL + ' , MAX(CASE COLUMNID WHEN ''' + COLUMNID + ''' THEN SOUCECOLVALUE  END) [' + COLUMNID + ']'   
 FROM (SELECT DISTINCT COLUMNID  FROM VW_DEP_DEPVMCOLVALUE WHERE VMID=@VMID) AS A    
 SET @SQL = @SQL + ' FROM VW_DEP_DEPVMCOLVALUE   
 LEFT JOIN DEPVMTARCOLVALUE ON TARGETID=DEPVMTARCOLVALUE.ID WHERE VW_DEP_DEPVMCOLVALUE.VMID='''+@VMID+'''  
 GROUP BY TARGETID,DEPVMTARCOLVALUE.VALUE'    
 EXEC(@SQL)    
END  
GO下边是我做的ORACLE的:
CREATE or REPLACE procedure 
GSP_DEP_VALUEMAPPINGSET   
(VMID   VARCHAR (36) )  
AS  
BEGIN  
   SQL VARCHAR(8000)   
 SQL := 'SELECT TARGETID ,DEPVMTARCOLVALUE.VALUE'  
SQL := SQL || ' , MAX(CASE COLUMNID WHEN ''' || COLUMNID || ''' THEN SOUCECOLVALUE  END) [' || COLUMNID || ']'   
 FROM (SELECT DISTINCT COLUMNID  FROM VW_DEP_DEPVMCOLVALUE WHERE VMID=VMID) AS A    
SQL := SQL || ' FROM VW_DEP_DEPVMCOLVALUE   
 LEFT JOIN DEPVMTARCOLVALUE ON TARGETID=DEPVMTARCOLVALUE.ID WHERE VW_DEP_DEPVMCOLVALUE.VMID='''||VMID||'''  
 GROUP BY TARGETID,DEPVMTARCOLVALUE.VALUE'    
 EXEC(SQL)    
END  
/可以不对,但是不知道那地方不正确在程序中执行的时候报
ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必须声明标识符 'GSP_DEP.VALUEMAPPINGSET'ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored
不知道什么原因;
谢谢

解决方案 »

  1.   

    应该就是格式的问题吧
    CREATE or REPLACE procedure GSP_DEP_VALUEMAPPINGSET
    is
    VMID VARCHAR(36);
    begin
    VMID:='aaa';
    dbms_output.put_line(VMID);
    end;
    /
    你可参考下这个存储过程, 改下格式 应该就没问题了(注意每行之间的分号 一定要写的)。lz过程中用到了表,我这不便调试!
      

  2.   


    CREATE or REPLACE procedure GSP_DEP_VALUEMAPPINGSET(VMID IN VARCHAR2(36)) AS
      sql_text VARCHAR2(8000);
    BEGIN
      sql_text := 'SELECT TARGETID ,DEPVMTARCOLVALUE.VALUE ,';
      sql_text := sql_text ||
                  'MAX(CASE COLUMNID WHEN COLUMNID THEN SOUCECOLVALUE END COLUMNID ';
      sql_text := 'FROM (SELECT DISTINCT COLUMNID FROM VM_DEP_DEPVMCOLVALUE WHERE VMID=' || VMID;
      sql_text := ' FROM VW_DEP_DEPVMCOLVALUE LEFT JOIN DEPVMTARCOLVALUE ON TARGETID=DEPVMTARCOLVALUE.ID ';
      sql_text := 'WHERE VW_DEP_DEPVMCOLVALUE.VMID=' || VMID;
      sql_text := ' GROUP BY TARGETID,DEPVMTARCOLVALUE.VALUE';
      EXECUTE IMMEDIATE sql_text;
    END