`
yimosmile
  • 浏览: 12849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类

<转>postgresql

阅读更多
一、如何判断一个表是否已经存在

     Sybase中可以使用如下语句来判断
   
select count(*) from systable where table_type = 'BASE' and table_name = 'tablename';


     也可以再加上creator=1来限定在用户创建的表而非系统的表。

     在从Sybase移植到PostgreSQL过程中,不得不考虑的就是这个问题。最初不知道用什么办法,所以简单的用一句

   
select * from tablename;


     然后加上Exception处理来判断表是否存在。

     后来去google了一下,原来有更多更简单的办法。

     一种:

   
select count(*) from pg_class where relname = 'tablename';


     另一种:

   
select count(*) from information_schema.tables where table_schema='public' and table_type='BASE TABLE' and table_name='tablename';


     最后一种,适用于检查那些临时的,虽然存在但却不可见的表的存在与否:

   
select count(*) from pg_catalog.pg_class where relkind = 'r' and relname = 'tablename' and pg_catalog.pg_table_is_visible(oid);


二、如何返回result和result set

     例如有表test_table的定义如下:

   
create table test_table(col_idx integer,
                 col_a varchar,
                 col_b text);

     首先,返回result,我更愿意说是返回record。一条记录。有两种办法。

     一种就是利用out参数返回,好处是不需要使用record类型,返回的数据结构清楚,便于使用。缺点是如果返回的列数目比较大,参数列表变长,不美观,不易于编写,有可能超过参数个数上限。以及,目前,我没办法用这种方式返回结果集。


     create or replace function test(in idx integer,out col_a varchar, out col_b text) AS $$
     begin
       select col_a, col_b into col_a,col_b from test_table where col_idx=idx;
     end;
     $$ LANGUAGE 'plpgsql';


     使用的时候,是这样的:

   
select * from test(1);


     值得注意的是,在Sybase的存储过程中使用out参数,在调用存储过程的时候,是:(假如a和b分别是目标变量,用于存储out参数返回的值)

   
call test(1,a,b);


     而同样的在PostgreSQL中,却是

   
select * from test(1) into a,b;




     另一种方法就是使用record类型作为存储过程的返回值类型。例如:


     create or replace function test(in idx integer) returns record AS $$
     declare
       rec record;
     begin
     
       select col_a, col_b into record from test_table where col_idx=idx;
       return rec;
     end;
     $$ LANGUAGE 'plpgsql';


     那么使用这个存储过程的时候,大致如下:
   
select * from test(1) a(a varchar, b text);


     其中a(a varchar, b text)就是为了给返回的record一个明确的结构定义。

     返回结果集使用的方法和上述的第二种方法类似。


     create or replace function test(in idx integer) returns setof record AS $$
     declare
       rec record;
     begin
     
       for rec in select col_a, col_b from test_table where col_idx=idx loop
         return next rec;
       end loop;
     end;
     $$ LANGUAGE 'plpgsql';


     使用时候也是一样的。
   
select * from test(1) a(a varchar, b text);


     同样,如果结果集中只有一条记录呢?那么就同样实现了返回单条记录的功能。

三、如何实现Sybase的执行动态SQL查询并返回结果集

     Sybase中,使用如下的一行即可:
   
execute immediate with result set on 'SQL Command';


     而对应的PostgreSQL中要实现这个功能,可以这样:

       for rec in execute 'SQL Command' loop
         return next rec;
       end loop;


     过程返回值类型是setof record。
     不过让我不确定的是,似乎以前的PostgreSQL版本的excute并不返回数据。而我在8.1上测试,没有问题。
分享到:
评论

相关推荐

    jeecgboot(postgreSQL).pdf

    &lt;artifactId&gt;postgresql&lt;/artifactId&gt; &lt;version&gt;42.2.5&lt;/version&gt; &lt;/dependency&gt; ``` 2. 修改数据库连接 在 Spring 配置文件中,需要添加 PostgreSQL 的连接配置。可以在 application.properties 文件中添加以下...

    MYSQL

    &lt;br&gt;8.4.4.3 选择特定列 &lt;br&gt;8.4.4.4 排序行 &lt;br&gt;8.4.4.5 日期计算 &lt;br&gt;8.4.4.6 NULL值操作 &lt;br&gt;8.4.4.7 模式匹配 &lt;br&gt;8.4.4.8 行计数 &lt;br&gt;8.4.5 使用多个数据库表 &lt;br&gt;8.5 获得数据库和表的信息 &lt;br&gt;8.6 以批处理...

    MySQL中文参考手册.chm

    &lt;br/&gt;8.4.4.3 选择特定列 &lt;br/&gt;8.4.4.4 排序行 &lt;br/&gt;8.4.4.5 日期计算 &lt;br/&gt;8.4.4.6 NULL值操作 &lt;br/&gt;8.4.4.7 模式匹配 &lt;br/&gt;8.4.4.8 行计数 &lt;br/&gt;8.4.5 使用多个数据库表 &lt;br/&gt;8.5 获得数据库和表的信息 &lt;br/&gt;8.6 ...

    xml 做数据库的 留言板 【——转——】

    &lt;datetime&gt;2022-03-01 14:30:00&lt;/datetime&gt; &lt;content&gt;这是我的第一条留言!&lt;/content&gt; &lt;/entry&gt; &lt;entry&gt; &lt;username&gt;用户B&lt;/username&gt; &lt;datetime&gt;2022-03-02 09:45:00&lt;/datetime&gt; &lt;content&gt;很高兴看到这个XML...

    nbearlite

    ** 请修改扩展名为ZIP&lt;br&gt;NBearLite是一个.NET 2.0开源(BSD协议)通用数据访问组件,支持SQL Server、Oracle、MS Access,MySQL,SQLite,PostgreSQL等多种数据库的透明切换(改变数据库类型时无需修改具体的查询代码...

    最新省市县行政区域(含编码)XML和JSON数据格式(含测试入库代码)

    每个`&lt;province&gt;`代表一个省份,包含`&lt;id&gt;`和`&lt;name&gt;`属性表示省的ID和名称,`&lt;cities&gt;`子节点则包含该省的所有城市信息。 JSON则是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,同时也易于人阅读和...

    PHP,CSS,HTML4.01 CHM电子文档

    1. **结构化标签**:提供如`&lt;head&gt;`、`&lt;body&gt;`、`&lt;h1&gt;`到`&lt;h6&gt;`、`&lt;p&gt;`、`&lt;table&gt;`等标签,定义页面的结构。 2. **图像支持**:通过`&lt;img&gt;`标签插入图像,并可通过`alt`属性提供替代文本。 3. **链接**:`&lt;a&gt;`标签...

    spring-jdbc(jdbctemplate)所需jar包

    &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt; &lt;version&gt;8.x.x&lt;/version&gt; &lt;/dependency&gt; ``` 以上是关于Spring JDBC和JdbcTemplate的基础知识,以及在项目中如何引入和使用它们。通过合理配置和使用这些jar包,...

    将关系型数据库MySQL存储数据转换为XML文件的实现

    &lt;出生日期&gt;1981-07-27&lt;/出生日期&gt; &lt;地址&gt;bupticet&lt;/地址&gt; &lt;电话&gt;01062284070&lt;/电话&gt; &lt;email&gt;hulijun168@qq.com&lt;/email&gt; &lt;邮政编码&gt;100000&lt;/邮政编码&gt; &lt;/用户&gt; &lt;!-- 更多用户记录 --&gt; &lt;/用户基本信息&gt; ``` ...

    转:LINUX POSTGRESQL测试库配置

    sudo nano /etc/postgresql/&lt;version&gt;/main/postgresql.conf ``` 在`pg_hba.conf`中,添加或修改允许本地和远程连接的行,例如: ``` host all all 0.0.0.0/0 md5 ``` 在`postgresql.conf`中,确保`listen_...

    heroku-jdbc:用于将数据库URL解析为JDBC连接的帮助程序库

    &lt; artifactId&gt;heroku-jdbc&lt;/ artifactId&gt; &lt; version&gt;${heroku-jdbc.version}&lt;/ version&gt; &lt;/ dependency&gt; 对于PostgreSQL(默认): Connection conn = DatabaseUrl . extract() . getConnection(); 对于其他...

    生成xml 文件 后并压缩

    &lt;description&gt;An in-depth look at creating applications with XML.&lt;/description&gt; &lt;/book&gt; &lt;/catalog&gt; ``` 2. **编程生成XML文件** 在各种编程语言中,都有库或API支持动态生成XML。例如,在Python中可以...

    电商数仓项目(九) Sqoop安装与配置

    &lt;name&gt;sqoop.metastore.client.rmi.registry.host&lt;/name&gt; &lt;value&gt;localhost&lt;/value&gt; &lt;/property&gt; &lt;property&gt; &lt;name&gt;sqoop.metastore.client.port&lt;/name&gt; &lt;value&gt;9999&lt;/value&gt; &lt;/property&gt; ... &lt;/...

    postgreSQL 拼音字库 汉字转拼音 8.4

    网上传的postgreSQL汉字转拼音的方法,是针对9.3的版本(相信你要是8.4的也搜到了但不能直接用,才来看我的),尝试了8.4的版本来做拼音处理。发现网上的《postgreSQL汉字转拼音》里面坑比较多,尝试纠正了一下,发...

    将数据库数据以XML文件格式保存

    这里,`&lt;employees&gt;`是根元素,包含多个`&lt;employee&gt;`子元素,每个员工的属性和数据分别对应子元素和其内容。 五、XML文件的优点和挑战 优点: - 数据结构清晰,易于解析和理解。 - 支持数据验证,通过XML Schema...

    mysql转换postgresql工具

    国外大牛写的一个mysql数据库转换postgresql的脚本。亲试可以无错误运行。

    C语言中使用ecpg访问Postgresql数据库

    &lt;protocol&gt;:&lt;service&gt;://&lt;machine&gt;:&lt;port&gt;/&lt;dbname&gt; as &lt;connectionname&gt; as &lt;loginname&gt; using &lt;password for login&gt; ``` 例如,连接到本地主机上的名为`dbdemo`的数据库,用户名为`noyear`,密码为`123456`: ``...

    数据表

    `&lt;table&gt;`是表格的容器,`&lt;tr&gt;`表示表格行,`&lt;th&gt;`代表表头单元格,`&lt;td&gt;`则是数据单元格。例如: ```html &lt;table&gt; &lt;tr&gt; &lt;th&gt;表头1&lt;/th&gt; &lt;th&gt;表头2&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;数据1&lt;/td&gt; &lt;td&gt;数据2&lt;/td&gt; &lt;/tr&gt; ...

    postgresql数据类型转换.pdf

    PostgreSQL是一款强大的开源关系型数据库管理系统(RDBMS),广泛应用于各个行业和领域,提供了丰富和灵活的数据类型和类型转换功能。在数据库操作中,根据实际应用需求,经常需要对数据进行类型转换。本文档详细...

Global site tag (gtag.js) - Google Analytics