POSTGRESQL 存储过程实战

转了N多的SQL语句,可是自己用时,却到处是坑啊,啊,啊!!!!!!!!!!!!!!!

想写一个获取表中最新ID值.

上代码

CREATE TABLE department(
   ID INT PRIMARY KEY                         NOT NULL,
   d_code                                     VARCHAR(50),
   d_name                                     VARCHAR(50)     NOT NULL,
   d_parentID                                 INT             NOT NULL  DEFAULT 0
);
--insert into department values(1,‘001‘,‘office‘);
--insert into department values(2,‘002‘,‘office‘,1);

下面要写个存储过程,以获取表中ID的最大值:

drop function f_getNewID(text,text);
create or replace function f_getNewID(myTableName text,myFeildName text) returns integer as $$
declare
    mysql text;
        myID integer;
begin
    mysql:=‘select max( $1 ) from $2‘;
        execute mysql into myID using myFeildName,myTableName; 

    if myID is null or myID=0 then return 1;
    else return myID+1;
      end if;
end;
$$ language plpgsql;

--大家可以试一下,上面这个是会报错的--select f_getNewID(‘department‘,‘ID‘);--出错!

看了官方文档,人家就是这么用的:

EXECUTE ‘SELECT count(*) FROM mytable WHERE inserted_by = $1 AND inserted <= $2‘
   INTO c
   USING checked_user, checked_date;

你确定你看清楚了?????

确定你读完读懂了说明书?????

--这个看了?
---------------------------------------
EXECUTE ‘SELECT count(*) FROM ‘
    || quote_ident(tabname)
    || ‘ WHERE inserted_by = $1 AND inserted <= $2‘
   INTO c
   USING checked_user, checked_date;

--这个看了?
---------------------------------------
EXECUTE ‘UPDATE tbl SET ‘
        || quote_ident(colname)
        || ‘ = ‘
        || quote_literal(newvalue)
        || ‘ WHERE key = ‘
        || quote_literal(keyvalue);

--=============================
--好吧, 我改
------------------------------------------------------
drop function f_getNewID(text,text);
create or replace function f_getNewID(myTableName text,myFeildName text) returns integer as $$
declare
    mysql text;
    myID integer;
begin
    mysql:=‘select max(‘
        || quote_ident(myFeildName)
        ||‘) from ‘
        || quote_ident(myTableName);
    execute mysql into myID;
    --using myTableName,myFeildName;

    if myID is null or myID=0 then return 1;
    else return myID+1;
      end if;
end;
$$ language plpgsql;

--==============================
--漂亮,成功了!--But Why?--注意 对象(表名、字段名等)是不可以直接用变量的,要用  quote_ident()-------------------------------------------------------
postgres=# select f_getnewid(‘department‘,‘ID‘);
--错误:  字段 "ID" 不存在
--第1行select max("ID") from department
                ^
--查询:  select max("ID") from department
--背景:  在EXECUTE的第10行的PL/pgSQL函数f_getnewid(text,text)

--===============================
--什么情况,ID怎么会有双引号,引号,号,号???
----------------------------------------------------------
--这里要感谢大神:权宗亮@飞象数据--改成这样:
postgres=# select f_getnewid(‘department‘,‘id‘);
 f_getnewid
------------
          2
(1 行记录)
----终于成功了!大小写还有区别吗??? --but why? --当在命令行输入


CREATE TABLE role(
   ID                                         INT PRIMARY KEY NOT NULL,
   r_name                                     VARCHAR(50)     NOT NULL,
   r_paretnID                                 INT             NOT NULL    DEFAULT 0
);
--结果在pgAdmin里看到的却是小写的
--同样,如果是在QUERY TOOLS 下用这样的语句创建还是 所有的字体名为小写--如果我就想大写怎么办????--要这样写
CREATE TABLE "RoleUPER"(
   "ID"                                         INT PRIMARY KEY NOT NULL,
   r_name                                     VARCHAR(50)     NOT NULL,
   "r_paretnID"                                 INT             NOT NULL    DEFAULT 0
);
--再用大象看看
--可以了! 

总结一下:

1、存储过程(FUNCITON)变量可以直接用  || 拼接。上面没有列出,下面给个栗子:

  

create or replace function f_getNewID(myTableName text,myFeildName text) returns integer as $$
declare
    mysql text;
        myID integer;
begin
    mysql:=‘select max(‘|| $2 || ‘ ) from ‘||$1;
        execute mysql into myID using myFeildName,myTableName;
    if myID is null or myID=0 then return 1;
    else return myID+1;
      end if;
end;
$$ language plpgsql;

2、存储过程的对象不可以直接用变量,要用 quote_ident(objVar)

3、$1  $2是 FUNCTION 参数的顺序,如1中的 $1 $2交换,USING 后面的不换 结果 :select max(myTableName) from myFeildname

4、注意:SQL语句中的大写全部会变成小写,要想大写存大,必须要用双引号。

时间: 2024-10-29 09:20:39

POSTGRESQL 存储过程实战的相关文章

PostgreSQL存储过程返回数据集实例

这里用一个实例来演示PostgreSQL存储过程如何返回数据集. 1 首先准备数据表 <pre name="code" class="sql">//member_category create table member_category(id serial, name text, discount_rate real, base_integral integer); alter table member_category add primary key(

调用PostgreSQL存储过程,找不到函数名的问题

PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题. 问题描述: 下面的示例测试代码: PWMIS.DataProvider.Data.AdoHelper db = MyDB.GetDBHelperByConnectionName("PostgreSQL");            IDataParameter para = db.GetParam

机房收费系统(VB.NET)——存储过程实战

最初接触存储过程是在耿建玲老师的视频里,当初只是草草过了一遍,只是有了个印象,知道了这个名词:大二时也有SqlServer数据库这门课,不过老师没讲,自己也没看:真正对存储过程的了解来自于自学考试中的<数据库系统原理>,在考试中,知道存储过程是干嘛的,在纸上怎么写,但从来没有在DBMS中亲手敲过.于是机房收费系统给了我这个机会. 在这里不再过多叙述关于存储过程德基本知识,只写一下在机房收费系统这个小项目中是如何用到存储过程的. 背景: 机房收费系统中有一个注册的功能,原型图如下: 注册时,需要

Mybatis调用PostgreSQL存储过程实现数组入参传递

注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 1 如上所示,参数是一个int数组,Mybatis提

PostgreSQL存储过程&lt;转&gt;

原创文章,转载请务必将下面这段话置于文章开头处(保留超链接).本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/12/27/SQL4_存储过程_Store Procedure/ 存储过程简介 什么是存储过程 百度百科是这么描述存储过程的:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,首次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果有)来执行它.它

PostgreSQL 存储过程/函数

1.有用的链接 postgresql 常用小函数 Postgresql数据库的一些字符串操作函数 PostgreSQL function里面调用function PostgreSQL学习手册(函数和操作符<二>) PostgreSQL的存储过程简单入门 2.建立块环境(执行环境) do language plpgsql $$ declare begin ... .. . end $$; 如 do language plpgsql $$ declare today date :=now(); y

PostgreSQL存储过程初探

什么是存储过程, 百度百科是这么定义的:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是 数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. Postgresql的存储过程语法结构如下: CREATE OR REPLACE FUNCTION 函数名(参数1,[整型 int4, 整型

Postgresql存储过程调试:PostgreSQL 之 Function NOTICE

转载自http://zhenghaoju700.blog.163.com/blog/static/13585951820116782843994/ 先安装一个PostgreSQL(见补充知识) 比较Oracle PL/SQL PL/SQL 中有 dbms_output.put_line("This is a log"); 可以进行简单的调试 当然我们PostgreSQL 也有相应的函数 RAISE NOTICE 'This is a log %', param: % 占位符 param

PostGreSQL存储过程

1 返回结果集的存储过程 -- drop FUNCTION getall();CREATE or REPLACE FUNCTION getall() RETURNS SETOF users  AS$BODY$SELECT * from  users;$BODY$language SQL;     --  这里使用的SQL 2 返回单个数值的的存储过程 -- drop FUNCTION adduser2(CHARACTER VARYING);CREATE or REPLACE FUNCTION a