New in Postgres Plus Advanced Server 9.2
Good News Postgres Plus Advanced Server Beta Version is now availabale, which has all the new feature of PostgreSQL 9.2, and it also has new features which are specific to Advanced Server.
I will cover/explain New features of PostgreSQL 9.2 later as per release Notes. However, the following link covers major features of PostgreSQL 9.2 and can be taken as reference.
1. INSERT APPEN HINT in PPAS 9.2
PPAS 9.2, now supports INSERT append hint. This is a very interesting feature and it is very useful for users who frequently delete records in Bulk and do bulk of INSERTs. This hint can provide some benefits in INSERTs. This hint makes PPAS not use Free Space Map and Append the rows at the end of relation(table). Its usage is given below:
PPAS 9.2 now allows calling procedure with following syntax:
lets see how it works:
a. Create a Procedure as Given below:
Function Definition:
PPAS already has Object Type support. However, the new version is coming with a new enhancement in that support. In New Version, user would be able to create Objects with Attributes, Functions, and Procedures. This gives an advantage of reduced coding in terms of defining Object types and maintaining it.
Example is given below:
a. Define a Type:
Subtypes is considered as a TYPE, which is defined on base/user defined types with some constraints, syntax for declaring SUBTYPE in PL/SQL is given below:
Example 1:
PPAS 9.2 now supports DROP TABLE CASCADE CONSTRAINTS, this is a very intersting feature and is not available in PostgreSQL 9.2.
Using this command, user would be able to drop all referential integrity constraints that refer to primary and unique keys in the dropped table. If you omit this clause and such referential integrity constraints exist, then the database returns an error and does not drop the table.
This is useful, when somebody wants to drop Master table but doesn't want to drop child table, which has Foreign Key Constraint and is referencing the Master.
An example is given below:
6. Allow throwing Multiple Errors as Warning, while compiling Procedures/Functions using SPL.
This is also a very interesting enhancement found for SPL. Whenever the user wants to compile a function/procedure in SPL, it will show all the error messages in the particular Function/Procedure Body, so that the user doesn't have to re-visit their code everytime to fix the other issue. An example is given below:
This is very useful for Developers/DBAs.
7. DEFAULT for Types declared in Packages:
Now, in PPAS 9.2, user would be able to define DEFAULT value for particular type, as given below:
8. TABLE Expression support for Nested Tables.
Now, in 9.2, user would be able to use TABLE Expressions for Nested tables. This feature was missing and asked by many Oracle DBAs. Table Expressions allows the user to query a collection in the FROM Clause like a Table.
9. INPUT/OUTPUT Functions for NESTED TABLES:
PPAS 9.2 supports user defined input/output functions for NESTED TABLE. This feature was missing in 9.1.
Some examples are given below:
Till PPAS 9.1, LOG was a reserved keyword and users were not allowed to create functions using this Keyword. In 9.2, a user would be able to use this keyword.
We know that current_date is special function which returns current date of PostgreSQL/PPAS DB. Till PPAS 9.1, users were not allowed to use this reserved name in variables. Now, in 9.2, users would be able to use it. As given below:
Since Oracle supports string as data type and this datatype wasn't available in PPAS 9.1, we have included it in 9.2. String is an alias to VARCHAR Data type. Example is given below:
PPAS 9.2 allowes users to use NVARCHAR2 as a datatype. In PPAS 9.2, NVARCHAR2 is mapped to VARCHAR data type. This is only for an Oracle user, who always asked question on having this in PPAS.
Example is given below:
EDB*Loader in PPAS 9.2, is more efficient, compared to 9.1, in loading data. There were some cases, in which it has been observed that it is difficult to find single character delimiter for data in file as the data in a file has all possible characters. To load those kind of data files, users can now define there own STRING Delimiter. An example is given below:
I will cover/explain New features of PostgreSQL 9.2 later as per release Notes. However, the following link covers major features of PostgreSQL 9.2 and can be taken as reference.
http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.2In this Blog, I am going to cover only specific features of Advanced Server 9.2 Core. Which are:
1. INSERT APPEN HINT in PPAS 9.2
PPAS 9.2, now supports INSERT append hint. This is a very interesting feature and it is very useful for users who frequently delete records in Bulk and do bulk of INSERTs. This hint can provide some benefits in INSERTs. This hint makes PPAS not use Free Space Map and Append the rows at the end of relation(table). Its usage is given below:
INSERT /*+append*/ INTO tab21115 VALUES(1,'abc',sysdate);2. Procedure Called like Function Call.
PPAS 9.2 now allows calling procedure with following syntax:
SELECT * FROM procedure(arg1,arg2,…);This type of Procedure call is allowed for Procedures which have OUT/INOUT Params. With this, user can use exec Function.
lets see how it works:
a. Create a Procedure as Given below:
CREATE OR REPLACE PROCEDURE foo_proc(A IN INT, B INOUT INT, C OUT INT) AS BEGIN b:=a+b; c:=b+1; END;Till 9.1 and even in 9.2, user can do something like given below:
DECLARE d int:=1; e int:=2; f int; BEGIN foo_proc(d,e,f); DBMS_OUTPUT.PUT_LINE('e = '||e); DBMS_OUTPUT.PUT_LINE('d = '||d); DBMS_OUTPUT.PUT_LINE('f= '||f); END; e = 3 d = 1 f= 4Now in 9.2, user can also do this:
edb=# select * from foo_proc(1,2); b | c ---+--- 3 | 4 (1 row)In case the user has Procedure and Function with a same name and the user wants to execute procedure using select command, then SELECT command is going to give preference to Function over Procedure as given below:
Function Definition:
CREATE OR REPLACE FUNCTION foo(a INT) RETURN INT AS BEGIN RETURN 2; END; CREATE PROCEDURE foo(A int, B OUT int) AS BEGIN B:=a+1; END; edb=# select * from foo(4); foo ----- 2However, user can still use EXEC command to execute Procedure as given below:
edb=# exec foo(4); ?column? ---------- 5 (1 row)Or if you are using Anonymous function then PERFORM will also work with Procedure as given below:
edb=# DECLARE edb-# a int:=4; edb$# b int; edb$# BEGIN edb$# PERFORM foo(a,b); edb$# DBMS_OUTPUT.PUT_LINE('b = '||b); edb$# END; b = 5 EDB-SPL Procedure successfully completed3. Object Type Support:
PPAS already has Object Type support. However, the new version is coming with a new enhancement in that support. In New Version, user would be able to create Objects with Attributes, Functions, and Procedures. This gives an advantage of reduced coding in terms of defining Object types and maintaining it.
Example is given below:
a. Define a Type:
CREATE OR REPLACE TYPE PersonObj AS OBJECT ( first_name VARCHAR2(50), last_name VARCHAR2(50), date_of_birth DATE, MEMBER FUNCTION getAge RETURN NUMBER );b. Define a Type Body:
CREATE OR REPLACE TYPE BODY PersonObj AS MEMBER FUNCTION getAge RETURN NUMBER AS BEGIN RETURN Trunc(Months_Between(Sysdate, date_of_birth)/12); END getAge; END;c. Define a Table based on Body type:
CREATE TABLE people ( id NUMBER(10) NOT NULL, person PersonObj );d. To insert Data, Default constructor can be use as given below:
INSERT INTO people VALUES (1, PersonObj('John','Doe', TO_DATE('01/01/1999','DD/MM/YYYY')));e. With the following way, a user can access the data in the table:
SELECT p.id, (p.person).first_name, p.person.getAge() age FROM people p; id | first_name | age ----+------------+----- 1 | John | 13 2 | Jane | 13 (2 rows)4. PL/SQL Subtypes:
Subtypes is considered as a TYPE, which is defined on base/user defined types with some constraints, syntax for declaring SUBTYPE in PL/SQL is given below:
SUBTYPEExample is given below:IS [(constraint)] [NOT NULL];
Example 1:
DECLARE SUBTYPE INT2 IS NUMBER; v2 INT2 (3,0); BEGIN v2:= 123; DBMS_OUTPUT.PUT_LINE ('V2 = '|| v2); END;Example 2:
DECLARE SUBTYPE v_word IS VARCHAR2(10) NOT NULL; verb v_word := 'verb'; noun v_word := 'noun'; BEGIN noun :='n1'; DBMS_OUTPUT.PUT_LINE (UPPER(verb)); DBMS_OUTPUT.PUT_LINE (UPPER(noun)); END;5. DROP TABLE CASCADE CONSTRAINTS in 9.2:
PPAS 9.2 now supports DROP TABLE CASCADE CONSTRAINTS, this is a very intersting feature and is not available in PostgreSQL 9.2.
Using this command, user would be able to drop all referential integrity constraints that refer to primary and unique keys in the dropped table. If you omit this clause and such referential integrity constraints exist, then the database returns an error and does not drop the table.
This is useful, when somebody wants to drop Master table but doesn't want to drop child table, which has Foreign Key Constraint and is referencing the Master.
An example is given below:
CREATE TABLE master(id numeric primary key); CREATE table child(id numeric references master(id)); insert into master values(1); insert into child values(1); edb=# drop table master cascade constraints; NOTICE: drop cascades to constraint child_id_fkey on table child DROP TABLE edb=# \d child Table "enterprisedb.child" Column | Type | Modifiers --------+---------+----------- id | numeric |As you can see above, I have dropped the Master table, on which child table has referential integrity constaint. However, my Child table still exists. PostgreSQL 9.2, doesn't have CASCADE CONSTRAINTS. Therefore, user has to first drop the constraints on table which has referential integrity constraints and then drop the referenced table. This process requires user to find all tables which has referential integrity constraints that refer to primary key of master table. This commands helps DBAs/Users not to worry about finding the child tables.
6. Allow throwing Multiple Errors as Warning, while compiling Procedures/Functions using SPL.
This is also a very interesting enhancement found for SPL. Whenever the user wants to compile a function/procedure in SPL, it will show all the error messages in the particular Function/Procedure Body, so that the user doesn't have to re-visit their code everytime to fix the other issue. An example is given below:
CREATE OR REPLACE FUNCTION foo() RETURN integer AS BEGIN a:=a=1 ; B:=b + 1; I am making fool; END; Output: ERROR: "a" is not a known variable LINE 4: a:=a=1 ^ ERROR: "b" is not a known variable LINE 6: B:=b + 1; ^ ERROR: syntax error at or near "I" LINE 7: I am making fool; ^ ERROR: compilation of SPL function/procedure "foo" failed due to 3 errorsAs you can see above, it has given all the mistakes that I made in Function Body, and now I can fix all of them in one go, to reduce the overhead of executing again and again.
This is very useful for Developers/DBAs.
7. DEFAULT for Types declared in Packages:
Now, in PPAS 9.2, user would be able to define DEFAULT value for particular type, as given below:
CREATE OR REPLACE PACKAGE INITPKG_pro_b4_default AS PROCEDURE show_default_values; n1 NUMBER DEFAULT 20; c1 VARCHAR2 DEFAULT 'Default'; END; CREATE OR REPLACE PACKAGE BODY INITPKG_pro_b4_default AS PROCEDURE show_default_values IS n number; BEGIN dbms_output.put_line(c1); dbms_output.put_line(n1); n1 := n1*n1; n1 := SQRT(n1); dbms_output.put_line(n1); END; END; edb=# exec INITPKG_pro_b4_default.show_default_values; Default 20 20.000000000000000 EDB-SPL Procedure successfully completed
8. TABLE Expression support for Nested Tables.
Now, in 9.2, user would be able to use TABLE Expressions for Nested tables. This feature was missing and asked by many Oracle DBAs. Table Expressions allows the user to query a collection in the FROM Clause like a Table.
edb=# CREATE OR REPLACE TYPE comp_typ_str_21189 IS TABLE OF VARCHAR2(100); CREATE TYPE edb=# edb=# select * from table(comp_typ_str_21189('PPP','QQQ')) ; column_value -------------- PPP QQQ (2 rows)
9. INPUT/OUTPUT Functions for NESTED TABLES:
PPAS 9.2 supports user defined input/output functions for NESTED TABLE. This feature was missing in 9.1.
Some examples are given below:
edb=# create or replace type mytab as table of varchar2(90); CREATE TYPE edb=# Create or replace function fun return mytab edb-# as edb$# begin edb$# return mytab('a','b',3); edb$# end; CREATE FUNCTION edb=# select fun; fun21168 ---------- {a,b,3} (1 row) edb=# edb=# create or replace function fun return mytab edb-# as edb$# nvar mytab; edb$# begin edb$# nvar := mytab(); edb$# nvar.extend(4); edb$# nvar(1) := 'foo'; edb$# nvar(2) := NULL; edb$# nvar(3) := 'deleteme'; edb$# nvar(4) := 'bar'; edb$# return nvar; edb$# end; CREATE FUNCTION edb=# --Verify User's is able to see that data edb=# select fun; fun21168 ------------------------- {foo,NULL,deleteme,bar} (1 row)9. LOG is no more a reserved keyword for functions.
Till PPAS 9.1, LOG was a reserved keyword and users were not allowed to create functions using this Keyword. In 9.2, a user would be able to use this keyword.
edb=# CREATE OR REPLACE FUNCTION log( a int ) return int as edb$# BEGIN edb$# dbms_output.put_line('Function LOG is called'); edb$# return a*2; edb$# END; CREATE FUNCTION edb=# SELECT LOG(10); Function LOG is called log ----- 20 (1 row)10. Variables can be named as current_date.
We know that current_date is special function which returns current date of PostgreSQL/PPAS DB. Till PPAS 9.1, users were not allowed to use this reserved name in variables. Now, in 9.2, users would be able to use it. As given below:
edb=# create table t_currentdate(current_date int); CREATE TABLE edb=# desc t_currentdate Table "enterprisedb.t_currentdate" Column | Type | Modifiers --------------+---------+----------- current_date | integer | create or replace procedure proc_currentdate(current_date date) is begin dbms_output.put_line(current_date); end; edb=# exec proc_currentdate(current_date); 05-OCT-12 00:00:00 EDB-SPL Procedure successfully completed11. New Data Type STRING.
Since Oracle supports string as data type and this datatype wasn't available in PPAS 9.1, we have included it in 9.2. String is an alias to VARCHAR Data type. Example is given below:
edb=# CREATE TABLE test_string(col string) edb-# ; CREATE TABLE edb=# insert into test_string values('As an Example'); INSERT 0 1 edb=# select * from test_string; col --------------- As an Example (1 row) edb=# \d test_string Table "enterprisedb.test_string" Column | Type | Modifiers --------+-------------------+----------- col | character varying |12. NVARCHAR2 data type support in 9.2
PPAS 9.2 allowes users to use NVARCHAR2 as a datatype. In PPAS 9.2, NVARCHAR2 is mapped to VARCHAR data type. This is only for an Oracle user, who always asked question on having this in PPAS.
Example is given below:
edb=# CREATE TABLE test_nvarchar(col NVARCHAR2(10)) edb-# ; CREATE TABLE edb=# \d test_nvarchar Table "enterprisedb.test_nvarchar" Column | Type | Modifiers --------+-----------------------+----------- col | character varying(10) |13. MultiByte and string delimiter support in EDB*loader.
EDB*Loader in PPAS 9.2, is more efficient, compared to 9.1, in loading data. There were some cases, in which it has been observed that it is difficult to find single character delimiter for data in file as the data in a file has all possible characters. To load those kind of data files, users can now define there own STRING Delimiter. An example is given below:
Data File: data.log: 1$$abc 2$$ccc 3$$dddddddd Control FIle: LOAD DATA INFILE '/tmp/data.log' BADFILE '/tmp/data.bad' truncate INTO table edb_loader FIELDS TERMINATED BY '$$' optionally enclosed by '"' (id , col ) -bash-4.1$ edbldr userid=enterprisedb/ control=/tmp/edb.ctl log=/tmp/edb.log EDB*Loader: Copyright (c) 2007-2012, EnterpriseDB Corporation. Successfully processed (3) records -bash-4.1$ psql psql (9.2.0.1) Type "help" for help. edb=# select * from edb_loader ; id | col ----+---------- 1 | abc 2 | ccc 3 | dddddddd (3 rows)
Comments
Post a Comment