使用变量作为列%TYPE(ORACLE)

时间:2018-05-12 22:04:57

标签: sql database oracle plsql

我需要制作一个编辑表'示例'的程序  edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value ???)使用此 ID 更新行的中的

问题是该表的列具有不同的数据类型。我可以做p_value exemplare.p_column%TYPE之类的事情吗?或者我是否必须将其设置为VARCHAR2然后(以某种方式)使用转换来更正数据类型?

2 个答案:

答案 0 :(得分:1)

  

我可以执行p_value exemplare.p_column%TYPE之类的操作吗?

没有。程序的签名必须是静态的。您可以做的是在程序包中重载该过程:

procedure edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value VARCHAR2);
procedure edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value DATE);
procedure edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value NUMBER);

但是,您仍需要动态SQL来解释p_column的元数据,以便您的代码保持笨重。

这种方法让我想起了在面向对象编程中仍然普遍存在的getter和setter范例。这不是适合SQL的方法。要编辑三个表列,您将进行三次程序调用,这将生成并执行三个动态UPDATE语句。这不能很好地扩展,并且它会导致OO开发人员断言数据库很慢,而事实上问题是在主叫端。

有多种方法可以解决这个问题,而正确的方法取决于你要做的事情的具体细节。关键点是:单个事务应该每个记录执行*不超过一个**更新语句。在一个语句中更新多个记录的基于集合的正确操作甚至更好。

答案 1 :(得分:0)

您可以使用{table}%ROWTYPE作为输入。this是一个很好的例子