如何将对象(表或列)名称传递到存储过程

时间:2013-01-02 16:43:17

标签: postgresql stored-procedures sql-update pgadmin

就规格而言,它是PostgreSQL 9.2,数据库通过PgAdmin3,表格格式为shapefile。如果需要任何其他详细信息,我将进行编辑和提供。

我基本上想要根据某些其他列中的字符串值是否为null来更新整数值列中的整数值。我最终希望将我存储的函数移植到使用jdbc的java应用程序中执行,但我首先要在pgadmin3中测试我的函数。我对postgresql的经验很少,而且语法上有点模糊。

因此,到目前为止,我对需要和放入的内容有一些参数:name,argmode,argname,argtype,column_name和lang_name。

据我所知,如果我没有返回任何内容,我可以包含RETURNS void as $$或者只是不包含return语句。我不认为我需要结果集,我只想替换列中的整数值。我不确定如何引用我需要的表来传递我想要处理的列。

到目前为止,这是我拼凑的代码:

CREATE [OR REPLACE] FUNCTION handle_malformed([[VARIADIC][]
table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name])

BEGIN
LOOP
IF NAME_1 IS NULL THEN 
IF LEVEL_DEPT != 0 THEN
    UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 0;
ELSE IF NAME_2 IS NULL THEN 
    IF LEVEL_DEPT != 1 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 1;
ELSE IF NAME_3 IS NULL THEN 
    IF LEVEL_DEPT != 2 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 2;
ELSE IF NAME_4 IS NULL THEN 
    IF LEVEL_DEPT != 3 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 3;
ELSE IF NAME_5 IS NULL THEN 
    IF LEVEL_DEPT != 4 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 4;
ELSE
    IF LEVEL_DEPT !=5 THEN 
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 5;
EXCEPTION 
END LOOP;
END PROCEDURE;
$$ LANGUAGE plpgsql;

update handle_malformed(AdminBoundaries.NAME_5, AdminBoundaries.NAME_4, AdminBoundaries.NAME_3, 
AdminBoundaries.NAME_2, AdminBoundaries.NAME_1, AdminBoundaries.NAME_0, AdminBoundaries.WIKI_URL, AdminBoundaries.LEVEL_DEPT)

我输入的逻辑是我在循环和结束循环之间放置的逻辑是我想要完成的逻辑。

我的具体问题是,如何使用SQL中参数的列名?

1 个答案:

答案 0 :(得分:3)

根据评论,我编辑了问题以包含一个问题......据我了解,您希望查询中使用参数中的值。为此,请使用EXECUTE并将查询组合为字符串。请注意,您无法参数化此类标识符,因此必须将它们连接起来,并使用quote_ident()来阻止in-stored-proc sql注入。

所以而不是:

 UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 1;

使用:

 EXECUTE $e$ UPDATE AdminBoundaries SET $e$ || quote_ident(LEVEL_DEPT) || $e$ = 1 $e$;

您也可以使用execute来处理动态检查:

 EXECUTE INTO my_bool $e$ SELECT a.$e$ || quote_ident(level_dept) $e$ is not null $e$;

我认为这会根据评论回答您的问题。如果没有,请随时澄清。