存储过程返回特定行plsql

时间:2017-07-12 07:15:12

标签: oracle stored-procedures plsql oracle11g

说我有一张桌子:

CONVERT(varchar,theNVarcharColumn)

我想编写一个包含两个参数的过程:

 create table product
(
  prod_code number(3),
  prod_name varchar2(20),
  prod_dept varchar2(20)
);

该过程需要检查列是否存在,如果存在,则返回值等于param_1 = col_name param_2 = col_value 的行。

示例:

假设程序名称为param_2,并且传递的参数如下:

执行getproddetails

当我传递这两个值时,它应该返回整个行getproddetails('prod_id', 40)

我可以查看列是否存在天气,但是如何根据值返回整行?

任何帮助都会很棒。我编写了以下代码,但它不起作用:

prod_id=40

请注意,我只显示了2列,但有8到9列。

2 个答案:

答案 0 :(得分:1)

如果您将param_2设置为VARCHAR2,则可以正常工作;使用隐式转换。

以下是我要做的事情,使用REF_CURSOR

create or replace procedure getempdetails (
   pcol_name in varchar2
 , pcol_value in varchar2
 , pres_cursor out sys_refcursor
) is 
begin
  open pres_cursor for 'SELECT emp_id, emp_name, emp_dept FROM emp WHERE '
  ||pcol_name||'='''||pcol_value||'''';
end;
/

编辑:使用:pcol_name;

更优雅

但我无法找到如何使其隐式转换。

create or replace procedure getempdetails (
   pcol_name in varchar2
 , pcol_value in varchar2
 , pres_cursor out sys_refcursor
) is 
begin
   OPEN pres_cursor 
    FOR 'SELECT emp_id, emp_name, emp_dept FROM emp WHERE :pcol_name='''||pcol_value||''''
  USING pcol_name;
end;

/

然后使用光标:

SQL>  insert into emp values(1, 'John', 'IT');

1 row created.

SQL> variable r refcursor;
SQL> exec  getempdetails('emp_id', '1', :r);

PL/SQL procedure successfully completed.

SQL>  print r
         1 John                 IT

SQL>

如果要在进一步的PL / SQL中使用此游标,请再搜索一下。例如。 像herehere这样的好例子。

NB: 基本上,in PL/SQL, ' escapes '。因此,如果您想在PL / SQL中的字符串中使用',则可以编写' I want a quote there -> '' <- '

答案 1 :(得分:0)

  

如何根据值返回整行?

您可以创建一个out参数,它可以是表格的类型,例如:

Procedure gettemplates( columnname in varchar2, value in varchar2, entirerowreturn out yourtable%rowtype) is ...