我需要制作一个编辑表'示例'的程序
edit_exemplare(p_id_exemplare IN NUMBER, p_column VARCHAR2, p_value ???)
使用此 ID 更新行的列中的值。
问题是该表的列具有不同的数据类型。我可以做p_value exemplare.p_column%TYPE
之类的事情吗?或者我是否必须将其设置为VARCHAR2然后(以某种方式)使用转换来更正数据类型?
答案 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是一个很好的例子