问题描述
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) 在数组中获取性能
你的第二个问题没有多大意义,因为要添加一列,我们需要的不仅仅是它的名字。此外,拥有动态向表添加列的应用程序通常不是一件明智的事情。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




