编写oracle 存储过程

I_am_the_No_1 2015-06-26 12:35:23
近期由于项目需要,需要编写一个存储过程,需求如下:
需要根据传递进来的参数‘column_name’去查询某表中的某列和id,查询出数据之后需要遍历并根据参数名称取值。
不知道oracle的存储过程是否可以实现,如果可以实现请贴出样例代码。如果不能实现,请提出可行性方案和样例代码。谢谢
...全文
215 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_am_the_No_1 2015-06-26
  • 打赏
  • 举报
回复
经过自己的努力,写出来了,谢谢回复
I_am_the_No_1 2015-06-26
  • 打赏
  • 举报
回复
引用 3 楼 chengccy 的回复:
[quote=引用 2 楼 I_am_the_No_1 的回复:]
贴下你的代码,可能是复制的时候,出现了乱码[/quote] 我重新拷贝下,代码可以跑,但是我除了查的列除了变量传过来的这一列还需要查ID列,查询之后该如何取参数列中的值呢
chengccy 2015-06-26
  • 打赏
  • 举报
回复
引用 2 楼 I_am_the_No_1 的回复:
贴下你的代码,可能是复制的时候,出现了乱码
I_am_the_No_1 2015-06-26
  • 打赏
  • 举报
回复
引用 1 楼 chengccy 的回复:
动态游标即可,例子:(具体可以百度相关资料)
SQL> SELECT * FROM EMP;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981-02-20    1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-02-22    1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-04-02    2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-09-28    1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-05-01    2850.00               30
 7782 CLARK      MANAGER    7839 1981-06-09    2450.00               10
 7788 SCOTT      ANALYST    7566 1987-04-19    3000.00               20
 7839 KING       PRESIDENT       1981-11-17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981-09-08    1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987-05-23    1100.00               20
 7900 JAMES      CLERK      7698 1981-12-03     950.00               30
 7902 FORD       ANALYST    7566 1981-12-03    3000.00               20
 7934 MILLER     CLERK      7782 1982-01-23    1300.00               10
14 rows selected

SQL> 
SQL> CREATE OR REPLACE PROCEDURE MY_PRO(COL_NAME VARCHAR2) IS VCUR SYS_REFCURSOR;
  2  V_SQL VARCHAR2(4000);
  3  V_COL_VALUE VARCHAR2(100);
  4  BEGIN
  5    V_SQL := 'select ' || COL_NAME || ' from emp';
  6    OPEN VCUR FOR V_SQL;
  7    LOOP
  8      FETCH VCUR
  9        INTO V_COL_VALUE;
 10      EXIT WHEN VCUR%NOTFOUND;
 11      DBMS_OUTPUT.PUT_LINE(V_COL_VALUE);
 12    END LOOP;
 13    CLOSE VCUR;
 14  END;
 15  /
Procedure created

SQL> set serveroutput on 
SQL> exec my_pro('ENAME');
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
PL/SQL procedure successfully completed
我用实例代码试了一下,有报错: PROCEDURE EBP_TEST_DBA.TEST 编译错误 错误:PLS-00103: 出现符号 "?"在需要下列之一时: constant exception <an identifier> <a double-quoted delimited-identifier> table long double ref char time timestamp interval date binary national character nchar 符号 "?" 被忽略。 行:3 文本:VCUR?SYS_REFCURSOR; 错误:PLS-00103: 出现符号 "END" 行:17 文本:END ARRAY_TEST; 错误:提示: Variable 'VCUR?SYS_REFCURSOR' 已被声明但从来没有被用于 'ARRAY_TEST' 行:3 文本:VCUR?SYS_REFCURSOR;
chengccy 2015-06-26
  • 打赏
  • 举报
回复
动态游标即可,例子:(具体可以百度相关资料)
SQL> SELECT * FROM EMP;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980-12-17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981-02-20    1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981-02-22    1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981-04-02    2975.00               20
 7654 MARTIN     SALESMAN   7698 1981-09-28    1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981-05-01    2850.00               30
 7782 CLARK      MANAGER    7839 1981-06-09    2450.00               10
 7788 SCOTT      ANALYST    7566 1987-04-19    3000.00               20
 7839 KING       PRESIDENT       1981-11-17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981-09-08    1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987-05-23    1100.00               20
 7900 JAMES      CLERK      7698 1981-12-03     950.00               30
 7902 FORD       ANALYST    7566 1981-12-03    3000.00               20
 7934 MILLER     CLERK      7782 1982-01-23    1300.00               10
14 rows selected

SQL> 
SQL> CREATE OR REPLACE PROCEDURE MY_PRO(COL_NAME VARCHAR2) IS VCUR SYS_REFCURSOR;
  2  V_SQL VARCHAR2(4000);
  3  V_COL_VALUE VARCHAR2(100);
  4  BEGIN
  5    V_SQL := 'select ' || COL_NAME || ' from emp';
  6    OPEN VCUR FOR V_SQL;
  7    LOOP
  8      FETCH VCUR
  9        INTO V_COL_VALUE;
 10      EXIT WHEN VCUR%NOTFOUND;
 11      DBMS_OUTPUT.PUT_LINE(V_COL_VALUE);
 12    END LOOP;
 13    CLOSE VCUR;
 14  END;
 15  /
Procedure created

SQL> set serveroutput on 
SQL> exec my_pro('ENAME');
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
PL/SQL procedure successfully completed

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧