一、如何判断一个表是否已经存在
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上测试,没有问题。
分享到:
相关推荐
<artifactId>postgresql</artifactId> <version>42.2.5</version> </dependency> ``` 2. 修改数据库连接 在 Spring 配置文件中,需要添加 PostgreSQL 的连接配置。可以在 application.properties 文件中添加以下...
<br>8.4.4.3 选择特定列 <br>8.4.4.4 排序行 <br>8.4.4.5 日期计算 <br>8.4.4.6 NULL值操作 <br>8.4.4.7 模式匹配 <br>8.4.4.8 行计数 <br>8.4.5 使用多个数据库表 <br>8.5 获得数据库和表的信息 <br>8.6 以批处理...
<br/>8.4.4.3 选择特定列 <br/>8.4.4.4 排序行 <br/>8.4.4.5 日期计算 <br/>8.4.4.6 NULL值操作 <br/>8.4.4.7 模式匹配 <br/>8.4.4.8 行计数 <br/>8.4.5 使用多个数据库表 <br/>8.5 获得数据库和表的信息 <br/>8.6 ...
<datetime>2022-03-01 14:30:00</datetime> <content>这是我的第一条留言!</content> </entry> <entry> <username>用户B</username> <datetime>2022-03-02 09:45:00</datetime> <content>很高兴看到这个XML...
** 请修改扩展名为ZIP<br>NBearLite是一个.NET 2.0开源(BSD协议)通用数据访问组件,支持SQL Server、Oracle、MS Access,MySQL,SQLite,PostgreSQL等多种数据库的透明切换(改变数据库类型时无需修改具体的查询代码...
每个`<province>`代表一个省份,包含`<id>`和`<name>`属性表示省的ID和名称,`<cities>`子节点则包含该省的所有城市信息。 JSON则是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,同时也易于人阅读和...
1. **结构化标签**:提供如`<head>`、`<body>`、`<h1>`到`<h6>`、`<p>`、`<table>`等标签,定义页面的结构。 2. **图像支持**:通过`<img>`标签插入图像,并可通过`alt`属性提供替代文本。 3. **链接**:`<a>`标签...
<artifactId>mysql-connector-java</artifactId> <version>8.x.x</version> </dependency> ``` 以上是关于Spring JDBC和JdbcTemplate的基础知识,以及在项目中如何引入和使用它们。通过合理配置和使用这些jar包,...
<出生日期>1981-07-27</出生日期> <地址>bupticet</地址> <电话>01062284070</电话> <email>hulijun168@qq.com</email> <邮政编码>100000</邮政编码> </用户> <!-- 更多用户记录 --> </用户基本信息> ``` ...
sudo nano /etc/postgresql/<version>/main/postgresql.conf ``` 在`pg_hba.conf`中,添加或修改允许本地和远程连接的行,例如: ``` host all all 0.0.0.0/0 md5 ``` 在`postgresql.conf`中,确保`listen_...
< artifactId>heroku-jdbc</ artifactId> < version>${heroku-jdbc.version}</ version> </ dependency> 对于PostgreSQL(默认): Connection conn = DatabaseUrl . extract() . getConnection(); 对于其他...
<description>An in-depth look at creating applications with XML.</description> </book> </catalog> ``` 2. **编程生成XML文件** 在各种编程语言中,都有库或API支持动态生成XML。例如,在Python中可以...
<name>sqoop.metastore.client.rmi.registry.host</name> <value>localhost</value> </property> <property> <name>sqoop.metastore.client.port</name> <value>9999</value> </property> ... </...
网上传的postgreSQL汉字转拼音的方法,是针对9.3的版本(相信你要是8.4的也搜到了但不能直接用,才来看我的),尝试了8.4的版本来做拼音处理。发现网上的《postgreSQL汉字转拼音》里面坑比较多,尝试纠正了一下,发...
这里,`<employees>`是根元素,包含多个`<employee>`子元素,每个员工的属性和数据分别对应子元素和其内容。 五、XML文件的优点和挑战 优点: - 数据结构清晰,易于解析和理解。 - 支持数据验证,通过XML Schema...
国外大牛写的一个mysql数据库转换postgresql的脚本。亲试可以无错误运行。
<protocol>:<service>://<machine>:<port>/<dbname> as <connectionname> as <loginname> using <password for login> ``` 例如,连接到本地主机上的名为`dbdemo`的数据库,用户名为`noyear`,密码为`123456`: ``...
`<table>`是表格的容器,`<tr>`表示表格行,`<th>`代表表头单元格,`<td>`则是数据单元格。例如: ```html <table> <tr> <th>表头1</th> <th>表头2</th> </tr> <tr> <td>数据1</td> <td>数据2</td> </tr> ...
PostgreSQL是一款强大的开源关系型数据库管理系统(RDBMS),广泛应用于各个行业和领域,提供了丰富和灵活的数据类型和类型转换功能。在数据库操作中,根据实际应用需求,经常需要对数据进行类型转换。本文档详细...