暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用Oracle的基本存储过程

askTom 2017-06-19
231

问题描述


1.使用表 [员工]

编写一个名为Get_Employee_Detail的存储过程,该过程将接受两个参数。

@ col_name varchar(100)
@ col_value varchar(500)

col_name参数可以接受表中的任何列名,col_value将接受该列的值。

例如,如果我将存储过程调用为

Exec get_employee _detail '国家编号','695256908'

输出将给出其中国家编号 = 695256908的表的所有行

业务实体id


国家编号


组织级别


工作标题


出生日期


MaritalStatus


性别


HireDate


薪水标志


休假时间


病假


当前标志

5


695256908


3




2)
使用varchar(100) 作为数据类型,创建具有五个列a,B,C,D和E的表。表名将是My_table

编写一个名为Update_Records的存储过程,该过程将接受1个参数。

@ col_name varchar(100)

如果我将任何列名传递给此过程,它将检查该列是否已经存在于表中。如果存在,它将打印 “已经存在的列”。如果不存在,您将更改My_table并添加该列。输出将是: “表更改”

例如,如果我将存储过程调用为

执行更新 _ 记录 'B'

输出将是:

列已经存在。

执行更新 _ 记录 'N'

输出将是:

表格更改

专家解答

这绝不是确定的,但将有助于说明一些要点:

a) 始终防范sql注入 (读取sql注入和dbms_assert)
b) 使用绑定变量
c) 在数组中获取性能

SQL> create or replace
  2  procedure p(col varchar2, val varchar2) is
  3    rc sys_refcursor;
  4    inj_test varchar2(255);
  5
  6    type elist is table of scott.emp%rowtype index by pls_integer;
  7    r elist;
  8  begin
  9
 10    select sys.dbms_assert.simple_sql_name(col) into inj_test from dual;
 11    open rc for 'select * from scott.emp where '||col||' = :1' using val;
 12
 13    fetch rc bulk collect into r;
 14    close rc;
 15
 16    for i in 1 .. r.count loop
 17      dbms_output.put_line(r(i).empno||','||r(i).ename);
 18    end loop;
 19  end;
 20  /

Procedure created.

SQL>
SQL> set serverout on
SQL> exec p('DEPTNO',10);
7782,CLARK
7839,KING
7934,MILLER


你的第二个问题没有多大意义,因为要添加一列,我们需要的不仅仅是它的名字。此外,拥有动态向表添加列的应用程序通常不是一件明智的事情。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论