mysql 在PostgreSQL中创建执行查询的过程

llew8vvj  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(164)

也许这不是新的情况下,但我堆栈关于它.这是我用来运行查询过程,它在MySQL中正常运行,但不是在PostgreSQL,我不知道如何做到这一点.该过程(在MySQL)看起来像:

CREATE PROCEDURE runstatement(IN statement TEXT)
BEGIN 
  SET @s = statement; 
  IF LENGTH(@s) <> 0 THEN PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
  END IF; 
END

字符串
问题:
1.如何将其转换为PostgreSQL版本?
1.当我在另一个过程中需要它时,我如何调用这个过程(runstatement)?在MySQL中我知道CALL runstatement(param)
谢谢你的回复。我是数据库编程的新手,尤其是PostgreSQL。

6tqwzwtp

6tqwzwtp1#

这种技术被命名为 dynamic SQL。PLpgSQL为这种情况提供了EXECUTE语句。可能为此编写特殊函数是无用的,因为EXECUTE是一行命令。

CREATE OR REPLACE FUNCTION runstatement(statement TEXT)
RETURNS void AS $$
BEGIN
  IF statement <> '' THEN
    EXECUTE statement;
  END IF;
END;
$$ LANGUAGE plpgsql;

字符串
可能测试空字符串是坏的设计。这种情况下不应该是。Assert是更好的。
这个函数可以被称为:

SELECT runstatement(''); -- outside plpgsql


PERFORM runstatement('') -- inside plpgsql


参见文档中的相关部分。

vltsax25

vltsax252#

如何在postgresql 11和dbconnection中使用. net创建存储过程
如果我们有旧版本,我们没有过程。现在我们在postgresql版本11中有过程。这是新的postgresql版本11。

-- DROP PROCEDURE public.sp_lite_web_login_conn(text, character varying, xml, xml);
        -- call sp_lite_web_login_conn('PG_LOAD', 'LG570', 'one', 'two')
        CREATE OR REPLACE PROCEDURE public.sp_lite_web_login_conn(
                        p_flag text,
                        p_site character varying,
                        INOUT result_one refcursor,
                        INOUT result_two refcursor)
        LANGUAGE 'plpgsql'
        AS $BODY$         
        BEGIN
              open result_one FOR SELECT 'NOT_OK' AS STATUS;
              open result_two FOR SELECT 'NOT_OK' AS STATUS;                                       
        END;
        $BODY$;

字符串
下面的过程基于refcursor选择查询。

public DataSet executeSelectQuery_POST_PROC(string _query, NpgsqlParameter[] sqlParameter)
                {
                    NpgsqlConnection npg_conn1 = new NpgsqlConnection(connstring);
                    try
                    {
                        npg_conn1.Open();
                        NpgsqlTransaction tran = npg_conn1.BeginTransaction();
                        DataSet ds = new DataSet();
                        DataTable dt = new DataTable();
                        NpgsqlCommand command = new NpgsqlCommand(_query, npg_conn1);
                        command.CommandType = CommandType.Text;
                        command.Parameters.AddRange(sqlParameter);
                        command.ExecuteNonQuery();
                        NpgsqlDataAdapter da;
                        int i = 0;
                        foreach (NpgsqlParameter parm in sqlParameter)
                        {
                            if (parm.NpgsqlDbType == NpgsqlTypes.NpgsqlDbType.Refcursor)
                            {
                                string parm_val = string.Format("FETCH ALL IN \"{0}\"", parm.Value.ToString());
                                da = new NpgsqlDataAdapter(parm_val.Trim().ToString(), npg_conn1);
                                ds.Tables.Add(parm_val);
                                da.Fill(ds.Tables[i]);
                                i++;
                            }
                        }
                        tran.Commit();
                        return ds;
                    }
                    catch (Exception ex)
                    {
                        return null;
                    }
                    finally
                    {
                        npg_conn1.Close();
                    }
                }

user control

  public DataSet db_validation(string flag, string site)
        {
            string query = string.Format(@"call sp_lite_web_login_conn('" + flag + "','" + site + "',@first_tbl,@second_tbl)");
            NpgsqlParameter[] sqlParameters = new NpgsqlParameter[4];
            sqlParameters[0] = new NpgsqlParameter("@p_flag", SqlDbType.VarChar);
            sqlParameters[0].Value = Convert.ToString(flag);
            sqlParameters[1] = new NpgsqlParameter("@p_site", SqlDbType.VarChar);
            sqlParameters[1].Value = Convert.ToString(site);
            //
            sqlParameters[2] = new NpgsqlParameter("@first_tbl", NpgsqlTypes.NpgsqlDbType.Refcursor);
            sqlParameters[2].Value = Convert.ToString("first_tbl");
            sqlParameters[2].Direction = ParameterDirection.InputOutput;
            sqlParameters[2].NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Refcursor;
            sqlParameters[3] = new NpgsqlParameter("@second_tbl", NpgsqlTypes.NpgsqlDbType.Refcursor);
            sqlParameters[3].Value = Convert.ToString("second_tbl");
            sqlParameters[3].Direction = ParameterDirection.InputOutput;
            sqlParameters[3].NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Refcursor;

            return conn.executeSelectQuery_POST_PROC(query, sqlParameters);
        }

zkure5ic

zkure5ic3#

您可以使用PL/pgSQL或SQL语言创建过程。

  • 备忘录:
  • My post解释了PL/pgSQL过程。
  • My post解释了一个SQL过程。

例如,创建test表,如下所示:

CREATE TABLE test (
  num INTEGER
);

字符串
然后,插入num2的行,如下所示:

INSERT INTO test (num) VALUES (2);


现在,您可以创建my_proc() PL/pgSQL过程,该过程将value添加到num并将value返回给调用者,如下所示:

CREATE PROCEDURE my_proc(IN value INTEGER, OUT result INTEGER)
LANGUAGE plpgsql
AS $$
BEGIN
  UPDATE test SET num = num + value;
  SELECT num INTO result FROM test;
END;
$$;


或者,您可以创建my_proc() SQL过程,将value添加到num并将value返回给调用者,如下所示:

CREATE PROCEDURE my_proc(IN value INTEGER, OUT result INTEGER)
LANGUAGE SQL
AS $$
UPDATE test SET num = num + value;
SELECT num FROM test;
$$;


然后,您可以使用CALL statement调用my_proc(3, 10),然后返回5,并将3添加到num,如下所示:

postgres=# CALL my_proc(3, 10);
 result
--------
      5
(1 row)

postgres=# SELECT num FROM test;
 num
-----
   5
(1 row)

相关问题