all-node-oracle
Version:
A NodeJS and Oracle DB integration, NodeJS act as http gateway for plsql server pages
161 lines (131 loc) • 5.13 kB
Markdown
<script src="header.js"></script>
<div id="title"> Call Oracle PL/SQL stored procedure with javascript in NodeJS </div>
The PSP.WEB software is tested on ORACLE DATABASE 11g(EE & XE) and NodeJS v0.6.2.
Introduction
===============================================================
Noradle is not limited to gateway the PL/SQL server pages, but can do more.
1. let javascript to call oracle plsql procedure for result, <br/>
or just submit data through parameters or request body
2. let javascript to call oracle message stream procedure for catching database event/message/command instantly <br/>
so it can be used for oracle to call NodeJS proxy for any external call, </br>
this way, Noracle extend oracle db for its lack of external access ability
Call for result page and convert the page to result sets
===============================================================
In Noradle(psp.web), you can let javascript call oracle plsql stored procedure, just like the code example as below
```
var Noradle = require('..')
, dbc = new Noradle.DBCall('demo', 'theOnlyDB')
;
Noradle.DBCall.init({oracle_port : 1523});
function UnitTest(){
dbc.call('db_src_b.example', function(status, page, headers){
console.log('status code is %d', status);
if (status != 200) {
console.error('status is', status);
return;
}
console.log('\n\nthe original result page is :');
console.log(page);
console.log('\n\n', 'the parsed result sets is :');
var rss = Noradle.RSParser.parse(page);
for (var n in rss) {
var rs = rss[n];
console.log('\n', 'ResultSet', n, 'is :');
console.log(rs);
}
});
}
UnitTest();
UnitTest();
UnitTest();
```
In oracle side, the `"db_src_b.example"` is :
```
create or replace package body db_src_b is
procedure example is
cur sys_refcursor;
v1 varchar2(50) := 'psp.web';
v2 number := 123456;
v3 date := date '1976-10-26';
begin
if r.call_type = 'HTTP' then
h.content_type(h.mime_text, 'UTF-8');
elsif r.call_type = 'DATA' then
h.line('# You are not required to write " h.content_type(h.mime_text, ''UTF-8'') " if call by NodeJS.');
end if;
h.line('# a stardard psp.web result sets example page');
h.line('# It can be used in browser or NodeJS');
h.line('# You can use some standard parser or write your own ' ||
'parsers to convert the raw resultsets to javascript data object');
h.line('# see PL/SQL source at ' || r.dad_path_full || '/src_b.proc/' || r.prog);
open cur for
select * from user_objects;
rs.print('test', cur);
open cur for
select v1 as name, v2 as val, v3 as ctime from dual;
rs.print('namevals', cur);
end;
end db_src_b;
```
The result log is as this:
```
status code is 200
the original result page is :
[]
OBJECT_NAME:1,SUBOBJECT_NAME:1,OBJECT_ID:2,DATA_OBJECT_ID:2,OBJECT_TYPE:1,CREATED:12,LAST_DDL_TIME:12,TIMESTAMP:1,STATUS:1,TEMPORARY:1,GENERATED:1,SECONDARY:1,NAMESPACE:2,EDITION_NAME:1
TERM_T,,73612,73612,TABLE,2012-04-10 09:47:12,2012-04-10 09:47:12,2012-04-10:09:47:12,VALID,N,N,N,1,
PK_TERM,,73613,73613,INDEX,2012-04-10 09:47:13,2012-04-10 09:47:13,2012-04-10:09:47:13,VALID,N,N,N,4,
USER_T,,73614,73614,TABLE,2012-04-10 09:47:13,2013-03-27 20:42:49,2012-04-10:09:47:13,VALID,N,N,N,1,
...
[]
NAME:1,VAL:2,CTIME:12
psp.web,123456,1976-10-26 00:00:00
the parsed result sets is :
ResultSet test is :
{ name: 'test',
attrs:
[ { name: 'OBJECT_NAME', dataType: '1' },
{ name: 'SUBOBJECT_NAME', dataType: '1' },
{ name: 'OBJECT_ID', dataType: '2' },
{ name: 'DATA_OBJECT_ID', dataType: '2' },
{ name: 'OBJECT_TYPE', dataType: '1' },
{ name: 'CREATED', dataType: '12' },
{ name: 'LAST_DDL_TIME', dataType: '12' },
{ name: 'TIMESTAMP', dataType: '1' },
{ name: 'STATUS', dataType: '1' },
{ name: 'TEMPORARY', dataType: '1' },
{ name: 'GENERATED', dataType: '1' },
{ name: 'SECONDARY', dataType: '1' },
{ name: 'NAMESPACE', dataType: '2' },
{ name: 'EDITION_NAME', dataType: '1' } ],
rows:
[ { OBJECT_NAME: 'TERM_T',
SUBOBJECT_NAME: '',
OBJECT_ID: '73612',
DATA_OBJECT_ID: '73612',
OBJECT_TYPE: 'TABLE',
CREATED: '2012-04-10 09:47:12',
LAST_DDL_TIME: '2012-04-10 09:47:12',
TIMESTAMP: '2012-04-10:09:47:12',
STATUS: 'VALID',
TEMPORARY: 'N',
GENERATED: 'N',
SECONDARY: 'N',
NAMESPACE: '1',
EDITION_NAME: '' },
...
]
ResultSet namevals is :
{ name: 'namevals',
attrs:
[ { name: 'NAME', dataType: '1' },
{ name: 'VAL', dataType: '2' },
{ name: 'CTIME', dataType: '12' } ],
rows: [ { NAME: 'psp.web', VAL: '123456', CTIME: '1976-10-26 00:00:00' } ] }
```
<script src="footer.js"></script>