简单的Oracle存储过程

Dmi*_*lov 3 oracle plsql stored-procedures

我有这个SQL查询:

select title
from DEPARTMENT;
Run Code Online (Sandbox Code Playgroud)

我试图编写一个存储过程:

create PROCEDURE select_some
(whats VARCHAR2 ,c_select_some OUT SYS_REFCURSOR) 
AS 
BEGIN 
OPEN c_select_some FOR
SELECT whats
FROM department;
END select_some;
/
Run Code Online (Sandbox Code Playgroud)

但是,在我使用“ title”参数执行它的地方,我得到了8行“ title”而不是实际内容。怎么了?

执行:

var whats varchar2(20)
variable whats = 'Title'
variable mycursor refcursor;

exec select_some (:whats, mycursor);
Run Code Online (Sandbox Code Playgroud)

Nic*_*nov 5

为此,您需要使用动态SQL。

像这样

create or replace procedure select_from_department(
  col_name in varchar2,
  c_res      out sys_refcursor
) 
is
  l_sql varchar2(300);
begin
  l_sql := 'select ' || dbms_assert.simple_sql_name(col_name) || ' from departments';
  open c_res for l_sql ;
end;
Run Code Online (Sandbox Code Playgroud)

演示

  • 再加上一个用于使用`dbms_assert.simple_sql_name`而不是简单地将`col_name`粘贴到查询字符串中。 (2认同)