Oracle动态函数和参数输入

时间:2015-12-24 15:46:09

标签: oracle plsql

你好,这个oracle程序:

SP_DELETE_FROM_TABLE(pTableName in VARCHAR2, pFieldName in VARCHAR2,pFieldValue in VARCHAR2,pFieldType in VARCHAR2)

我想知道的是fieldtype参数是什么?

我的意思是我可以

queryString := 'DELETE FROM' ||pTableName|| 'WHERE pFieldName = pFieldValue' ;
 EXECUTE IMMEDIATE queryString USING pFieldName, pFieldValue;

正确?我在这里错过了什么?有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:3)

表名不能是参数,因此您必须将其替换为字符串。这就像你的例子,除了你需要在它周围放置空格,如@are所说:

queryString := 'DELETE FROM ' || pTableName || ' WHERE...
                           ^ space here         ^ and here

列名也不能是参数。

您要替换的字段值是参数,因此需要(1)名称和(2)前面的冒号。我将其命名为thing,因此名称明显不同于proc的pFieldValue参数:

queryString := 'DELETE FROM ' || pTableName || ' WHERE ' || pFieldName || ' = :thing';
                                                                              ^ parameter

USING的{​​{1}}部分用于提供参数值,句点。查询有一个参数,因此EXECUTE IMMEDIATE提供一个值:

USING

第一个参数(EXECUTE IMMEDIATE queryString USING pFieldValue; )的值为thing

还有一件事:许多人(包括我)认为通用的“删除行”程序是不好的做法。而不是代码中的编译器检查语句......

pFieldValue

...你有一些不可检查的东西 - 如果它错了它会在运行时失败:

DELETE FROM myTable WHERE myField = pFieldValue;

如果你必须这样做怎么办?

SP_DELETE_FROM_TABLE('myTable', 'myField', 'badidea');

您是否延长了DELETE FROM myTable WHERE myValue BETWEEN 10 AND 12; 程序,还是写了另一个程序?这个程序是一个很好的练习,但在真实应用程序中使用它之前请三思而后行。

那就是说,有时候你 使用SP_DELETE_FROM_TABLE进行这样的操作(例如,如果通过DB链接访问表)。明智地使用它:)