⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ora2c.sql

📁 c#数据库访问自动生成代码程序
💻 SQL
📖 第 1 页 / 共 2 页
字号:
     END LOOP;
     v_tab(v_i):=v_str;
     v_paracnt:=v_i;
  END;

  PROCEDURE getPara(v_parastr VARCHAR2,v_paraname OUT arraystr,
  v_paratype OUT arraystr, v_paradir OUT arraystr, v_paracnt IN OUT BINARY_INTEGER)
  AS
     v_tab arraystr;
     v_iloc BINARY_INTEGER;
     v_iloc1 BINARY_INTEGER;

     v_str1 VARCHAR2(300);
     v_str2 VARCHAR2(300);
     v_str3 VARCHAR2(300);
  BEGIN
       --解析参数
       v_iloc:=instr(v_parastr,',');
       IF v_iloc=0 THEN
          v_tab(1):=v_parastr;
          v_paracnt:=1;
       ELSE
          comma_to_table(v_parastr,v_paracnt,v_tab);
       END IF;

       FOR i IN 1..v_paracnt LOOP
           --替换tab键,只考虑空格
           v_str1 :=TRIM(REPLACE(v_tab(i),chr(9),' '));
           v_str2 :=upper(v_str1);

           v_iloc:=instr(v_str2,' IN ');
           v_iloc1:=instr(v_str2,' OUT ');

           IF v_iloc>0 AND v_iloc1>0 THEN
              v_paradir(i):='InputOutput';
           ELSIF v_iloc1>0 THEN
              v_paradir(i):='Output';
           ELSE
              v_paradir(i):='Input';
           END IF;

           v_str3:=REPLACE(v_str2,' IN ',' ');
           v_str3:=REPLACE(v_str3,' OUT ',' ');

           v_iloc:=instr(v_str3,' ');

           v_paraname(i):=TRIM(substr(v_str1,1,v_iloc));

           v_paratype(i):=TRIM(substr(v_str3,v_iloc+1));

       END LOOP;

  END;



  FUNCTION getIDataType(v_oratype VARCHAR2) RETURN VARCHAR2
  IS
  BEGIN
       IF v_oratype='VARCHAR2' THEN
          RETURN 'IDataType.VarChar';
       ELSIF v_oratype='NUMBER' THEN
          RETURN 'IDataType.Number';
       ELSIF v_oratype IN ('T_CURSOR','REF_CURSOR') THEN
          RETURN 'IDataType.Cursor';
       ELSIF v_oratype='DATE' THEN
          RETURN 'IDataType.DateTime';
       ELSIF v_oratype='CHAR' THEN 
          RETURN 'IDataType.Char';
       END IF;
  END ;

  FUNCTION getC#Type(v_oratype VARCHAR2) RETURN VARCHAR2
  IS
  BEGIN
       IF v_oratype='VARCHAR2' THEN
          RETURN 'string';
       ELSIF v_oratype='NUMBER' THEN
          RETURN 'int';
       ELSIF v_oratype IN ('T_CURSOR','REF_CURSOR') THEN
          RETURN 'DataSet';
       ELSIF v_oratype='DATE' THEN
          RETURN 'DateTime';
       ELSIF v_oratype='CHAR' THEN 
          RETURN 'string';
       END IF;
  END ;


  FUNCTION getC#OutputValue(v_oratype VARCHAR2, v_id NUMBER) RETURN VARCHAR2
  IS
  BEGIN
       IF v_oratype='VARCHAR2' THEN
          RETURN 'pms['||(v_id-1)||'].Value.ToString());';
       ELSIF v_oratype='NUMBER' THEN
          RETURN 'int.Parse(pms['||(v_id-1)||'].Value.ToString());';

       ELSIF v_oratype='DATE' THEN
          RETURN '(DateTime)pms['||(v_id-1)||'].Value;';
       ELSIF v_oratype='CHAR' THEN
          RETURN 'pms['||(v_id-1)||'].Value.ToString());';
       END IF;
  END ;


BEGIN

     v_paracnt:=0;


     v_rlname:=TRIM(v_name);
     v_iLoc:=instr(v_rlname,';');

     IF v_iLoc>0 THEN
        v_rlname:=substr(v_rlname,1,v_iLoc);
     END IF;

     v_rlname:=rTRIM(v_rlname,chr(13));
     v_rlname:=rtrim(v_rlname,';');
     v_rlname:=REPLACE(v_rlname,CHR(9),' ');
     v_upname:=upper(v_rlname);
     --判断是函数还是存储过程
     v_iLoc:=instr(v_upname,'FUNCTION');
     v_isFunc:=TRUE;
     IF v_iLoc=0 THEN
        v_iLoc:=instr(v_upname,'PROCEDURE');
        IF v_iLoc=0 THEN
           RETURN '语法错误';
        END IF;
        v_isFunc:=FALSE;
     END IF;

     --判断括号,在过程名中只能出现一对括号
     v_iLoc0:=instr(v_upname,'(');
     IF v_iLoc0=0 THEN
        v_havec:=FALSE;
     ELSE
        v_iLoc1:=instr(v_upname,'(',v_iLoc1+1);
        IF v_iLoc1>0 THEN
           RETURN 'have more than one (;';
        END IF;
        v_havec:=TRUE;
     END IF;


     
     IF v_isFunc=TRUE THEN
        --是函数
        v_iLoc1:=instr(v_upname,'RETURN');
        IF v_iLoc1=0 THEN
           RETURN 'function no return';
        END IF;

        IF v_havec=TRUE THEN
           --有参数
           v_iLoc2:=instr(v_upname,')');
           v_parastr:=substr(v_rlname,v_iLoc0+1, v_iloc2-v_iLoc0-1);

           v_methodname:=trim(substr(v_rlname,v_iLoc+8,v_iLoc0-v_iLoc-8));

           getPara(v_parastr,v_paraname , v_paratype, v_paradir, v_paracnt );

        ELSE
           v_methodname:=trim(substr(v_rlname,v_iLoc+8,v_iLoc1-v_iLoc-8));
        END IF;


        --返回参数
        v_paratype(v_paracnt+1):=trim(substr(v_upname,v_iLoc1+6));

        SELECT decode(v_paratype(v_paracnt+1), 'VARCHAR2','string','NUMBER',
         'int','DATE','DateTime','CHAR','string', NULL) INTO v_returntype FROM dual;

        IF v_returntype IS NULL THEN
           RETURN 'function return type error.';
        END IF;
        v_paraname(v_paracnt+1):='result';
        v_paradir(v_paracnt+1):='ReturnValue';

     ELSE
        --存储过程
        IF v_havec=TRUE THEN
           --有参数
           v_iLoc2:=instr(v_upname,')');
           v_parastr:=substr(v_rlname,v_iLoc0+1, v_iloc2-v_iLoc0-1);

           v_methodname:=trim(substr(v_rlname,v_iLoc+9,v_iLoc0-v_iLoc-9));
           getPara(v_parastr,v_paraname , v_paratype, v_paradir, v_paracnt );
        ELSE
           --无参数
           v_methodname:=trim(substr(v_rlname,v_iLoc+9));
        END IF;
        v_returntype:='void';
     END IF;
     
     
     --校验参数类型
     FOR i in 1..v_paracnt LOOP
         IF v_paratype(i) NOT IN ('VARCHAR2','NUMBER','DATE','REF_CURSOR','T_CURSOR','CHAR') THEN
            RETURN 'function or procedure parameter type error.';
         END IF;

         SELECT decode(v_paratype(i),'VARCHAR2','string','NUMBER',
         'int','DATE','DateTime','REF_CURSOR','DataSet', 'T_CURSOR', 'DataSet','CHAR','string') INTO v_paratype_c#(i) FROM dual ;


         IF v_paratype(i) IN ('REF_CURSOR','T_CURSOR') THEN
            v_returntype:='DataSet';
            --第一个cursor位置,以及cursor数
            IF v_paracnt_firstcursor=0 THEN 
               v_paracnt_firstcursor:=i-1;
            END IF;
            v_cursorcnt:=v_cursorcnt+1;
         END IF;
     END LOOP;

     IF v_returntype = 'DataSet' THEN
        IF v_paratype(v_paracnt) NOT  IN ('REF_CURSOR','T_CURSOR') THEN
            RETURN '存储过程返回游标应该为最后一个参数';
        END IF;
        v_paracnt:=v_paracnt-1;
     END IF;


     v_rt:='public static '||v_returntype||' '||v_methodname||'(';

     IF v_cursorcnt<2 THEN         
        v_paracnt_firstcursor:=v_paracnt;
     END IF;
     
     FOR i in 1..v_paracnt_firstcursor LOOP               
         IF v_paradir(i) IN ('Output','InputOutput') THEN
            v_rt:=v_rt|| ' ref '||v_paratype_c#(i)||' ';
         ELSE
            v_rt:=v_rt||v_paratype_c#(i)||' ';
         END IF;     

         IF i=v_paracnt THEN
            v_rt:=v_rt||v_paraname(i);
         ELSE
            v_rt:=v_rt||v_paraname(i)||',';
         END IF;
     END LOOP;
     

     v_rt:=v_rt||')'||chr(13)||chr(10)||'{'||chr(13)||chr(10);

     v_tstr:='string mConn = IConfiguration.getParameter("connectString");';
     v_rt:=v_rt||chr(9)||v_tstr||chr(13)||chr(10);
     
     v_tstr:='IDBO.IDBO dbo = IDBO.IDBO.getIDBO(mConn);';
     
     v_rt:=v_rt||chr(9)||v_tstr||chr(13)||chr(10);
     v_tstr:='try';
     v_rt:=v_rt||chr(9)||v_tstr||chr(13)||chr(10);
     v_tstr:='{';
     v_rt:=v_rt||chr(9)||v_tstr||chr(13)||chr(10);
     v_tstr:='dbo.openDatabase();';
     v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);
     ---------------

     IF v_returntype<>'void' THEN
        v_paracnt:=v_paracnt+1;
     END IF;


     v_tstr:='IPrameter[] pms=new IPrameter['||v_paracnt||'];';
     v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);

     FOR i IN 1..v_paracnt LOOP

         --初始化
         --v_tstr:='pms['||(i-1)||'] = new IDBO.IPrameter("'||
         v_tstr:='pms['||(i-1)||'] = new IPrameter("'||
         v_paraname(i)||'",'||
         getIDataType(v_paratype(i))||
         ',ParameterDirection.'||v_paradir(i)||
         ');';
         v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);


         IF v_paradir(i) IN ('Input','InputOutput') THEN
            v_tstr:='pms['||(i-1)||'].Value='||v_paraname(i)||';';
            v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);
         END IF;


         IF v_paradir(i) IN ('InputOutput','Output','ReturnValue') AND v_paratype(i)='VARCHAR2' THEN
            v_tstr:='pms['||(i-1)||'].Size=1024;';
            v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);
         END IF;
     END LOOP;

     IF v_pkgname IS NOT NULL THEN
        v_methodname:=v_pkgname||'.'|| v_methodname;
     END IF;


     IF v_returntype = 'DataSet' THEN
         v_tstr:='DataSet ds = dbo.executeProcedure("'||v_methodname||'", pms);';
     ELSE
         v_tstr:='dbo.executeFunction("'||v_methodname||'", pms);';
     END IF;
     v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);

     FOR i IN 1..v_paracnt LOOP
         IF v_paradir(i) IN ('Output','InputOutput') AND v_paratype(i) NOT IN ('T_CURSOR','REF_CURSOR') THEN
            v_tstr:=v_paraname(i)||'= '||getC#OutputValue(v_paratype(i),i);
            v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);
         END IF;
     END LOOP;


     IF v_returntype = 'DataSet' THEN
         v_tstr:='return ds;';
         v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);
     ELSIF v_returntype<>'void' THEN
         v_tstr:='return ('||getC#Type(v_paratype(v_paracnt))||')'||'pms['||(v_paracnt-1)||'].Value;';
         v_rt:=v_rt||chr(9)||chr(9)||v_tstr||chr(13)||chr(10);
     END IF;

     ---------------
     v_tstr:='}';
     v_rt:=v_rt||chr(9)||v_tstr||chr(13)||chr(10);
     v_tstr:='catch (Exception e)'||chr(13)||chr(10)||
     chr(9)||'{'||chr(13)||chr(10)||
     chr(9)||chr(9)||'iLog.Error(e.Message.ToString());'||chr(13)||chr(10)||
     chr(9)||chr(9)||'throw e;'||chr(13)||chr(10)||
     chr(9)||'}'||chr(13)||chr(10)||
     chr(9)||'finally'||chr(13)||chr(10)||
     chr(9)||'{'||chr(13)||chr(10)||
     chr(9)||chr(9)||'dbo.closeDatabase();'||chr(13)||chr(10)||
     chr(9)||'}';

     v_rt:=v_rt||chr(9)||v_tstr||chr(13)||chr(10)||'}';
     RETURN v_rt;
END;


END ;
/


spool off

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -