如何在 Postgresql 的 DO 语句中使用查询参数?
How to use a query parameter in DO statement in Postgresql?
我试图在 DO 语句中使用查询参数。
但下面的示例代码因异常而失败。
Message=42703: column "param" does not exist
using (var conn = new NpgsqlConnection(cs)) {
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new NpgsqlParameter("@param", 200));
cmd.CommandText = @"
DO $$
DECLARE _temp_val integer := @param;
BEGIN
-- do something
CREATE TEMP TABLE TEMP_TB(
VALUE1 INTEGER
);
INSERT INTO TEMP_TB (VALUE1) VALUES (_temp_val);
END $$;
SELECT * FROM TEMP_TB;
";
var result = cmd.ExecuteScalar();
}
另一方面,下面的示例代码无一例外地成功了。
using (var conn = new NpgsqlConnection(cs)) {
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new NpgsqlParameter("@param", 200));
cmd.CommandText = "select @param;";
var result = cmd.ExecuteScalar();
}
如何修复错误?
谢谢
您不能在 DO
语句中使用参数。
要么在客户端构造查询字符串(提防SQL注入!)要么(更好)在数据库中编写一个函数并传递一个参数。
我试图在 DO 语句中使用查询参数。
但下面的示例代码因异常而失败。
Message=42703: column "param" does not exist
using (var conn = new NpgsqlConnection(cs)) {
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new NpgsqlParameter("@param", 200));
cmd.CommandText = @"
DO $$
DECLARE _temp_val integer := @param;
BEGIN
-- do something
CREATE TEMP TABLE TEMP_TB(
VALUE1 INTEGER
);
INSERT INTO TEMP_TB (VALUE1) VALUES (_temp_val);
END $$;
SELECT * FROM TEMP_TB;
";
var result = cmd.ExecuteScalar();
}
另一方面,下面的示例代码无一例外地成功了。
using (var conn = new NpgsqlConnection(cs)) {
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new NpgsqlParameter("@param", 200));
cmd.CommandText = "select @param;";
var result = cmd.ExecuteScalar();
}
如何修复错误? 谢谢
您不能在 DO
语句中使用参数。
要么在客户端构造查询字符串(提防SQL注入!)要么(更好)在数据库中编写一个函数并传递一个参数。