zoukankan      html  css  js  c++  java
  • 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语句中的大写全部会变成小写,要想大写存大,必须要用双引号。

  • 相关阅读:
    第四章、Vue组件
    第三章、Vue实例
    第二章、Vue指令
    Python练习实例012
    Python练习实例011
    Python练习实例010
    Python练习实例009
    Python练习实例008
    Python练习实例007
    Python练习实例006
  • 原文地址:https://www.cnblogs.com/ssqhan/p/7289931.html
Copyright © 2011-2022 走看看