noradle-ndbc
Version:
node.js database connectivity to oracle by noradle
136 lines (125 loc) • 4.78 kB
Markdown
Use NDBC API to access ORACLE
-----------------------------
through PL/SQL servlet can print arbitrary content to feed NDBC call,
the most NDBC use is for fetch SQL
[result sets](https://github.com/kaven276/noradle/wiki/SQL-resultsets),
so the example is for that.
### The node javascript client who call in oracle plsql servlet
```javascript
var DBDriver = require('noradle-nodejs-client')
, NDBC = require('noradle-ndbc')
, dbPool = DBDriver.connect([9009], {cid : 'test', passwd : 'test'})
, dbc = new NDBC.DBCall(dbPool, {__parse : true, 'x$dbu': 'demo'})
;
dbc.call('db_src_b.example', {limit : 3}, function(status, headers, page){
if(status!==200) {
...
return;
}
console.log(status);
console.log(headers);
console.log(page);
});
```
Note:
* NDBC instance have dbPool as oracle access path supporting object as `(dbPool, {...`
* NDBC have default parameter in second parameter as `{__parse : true, 'x$dbu': 'demo'}`
* ndbc.call(stored_procedure_name, parameter, cb) will combine default parameter to make a PL/SQL servlet request
* callback(status, headers, page) is just like http response
* headers is name-value(s) pairs
* page is Buffer, String or Object type as headers['content-type'] indicate
* `__parse : true` will let noradle automatically convert certain response type to parsed javascript objects
for how raw SQL result is parsed, see [noradle-resultsets][]
[noradle-resultsets]: https://github.com/noradle/noradle-resultsets
### The oracle plsql sevlet code who generate SQL result sets
```plsql
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
h.content_type('text/resultsets');
open cur for
select a.object_name, a.subobject_name, a.object_type, a.created
from user_objects a
where rownum <= r.getn('limit', 8);
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;
```
Note:
* `r.getn('limit', 8)` will get number type parameter `limit`, as js code, it's 3, and default to `8` if no this input
* `h.content_type('text/resultsets');` specify the response content-type is result sets
that can be converted to javascript object or JSON text
* `rs.print(name, sys_refcursor)` will print SQL result and its meta data to condensed table format
* `v1,v2,v3` is varchar2/number/date types, all scalar data can be printed out with `from dual` SQL
### the data in transfer
```
[objects]
OBJECT_NAME:1,SUBOBJECT_NAME:1,OBJECT_TYPE:1,CREATED:12
TOOL,,TYPE,2015-04-20 16:38:39
TOOL2,,TYPE,2015-04-20 16:38:39
TERM_T,,TABLE,2015-04-20 16:38:45
[namevals]
NAME:1,VAL:2,CTIME:12,P1:1,P2:1,PNULL:1
psp.web,123456,1976-10-26 00:00:00,value1,value2,
```
Note:
* SQL resultsets is printed section by section
* one resultset have one meta line and zero, one or more data lines each line for one record
* columns/lines are separate not only with comma and linefeed, but with a hidden ACSII char together with separator
so column content can safely have comma and linefeed.
### the output
```
200
{ Date: 'Fri, 24 Jul 2015 00:55:46 GMT',
'Content-Encoding': '?',
'Content-Length': '649',
'Content-Type': 'text/resultsets; charset=UTF-8',
'x-pw-timespan': '40 / 40 ms' }
{ objects:
{ name: 'objects',
attrs:
[ { name: 'object_name', dataType: 1 },
{ name: 'subobject_name', dataType: 1 },
{ name: 'object_type', dataType: 1 },
{ name: 'created', dataType: 12 } ],
rows:
[ { object_name: 'TOOL',
subobject_name: '',
object_type: 'TYPE',
created: '2015-04-20 16:38:39' },
{ object_name: 'TOOL2',
subobject_name: '',
object_type: 'TYPE',
created: '2015-04-20 16:38:39' },
{ object_name: 'TERM_T',
subobject_name: '',
object_type: 'TABLE',
created: '2015-04-20 16:38:45' } ] },
namevals:
{ name: 'namevals',
attrs:
[ { name: 'name', dataType: 1 },
{ name: 'val', dataType: 2 },
{ name: 'ctime', dataType: 12 },
{ name: 'p1', dataType: 1 },
{ name: 'p2', dataType: 1 },
{ name: 'pnull', dataType: 1 } ],
rows:
[ { name: 'psp.web',
val: 123456,
ctime: '1976-10-26 00:00:00',
p1: 'value1',
p2: 'value2',
pnull: '' } ] } }
```
Note:
* the parsed final result is javascript object, each key stand for one result set
* each result set have name, attrs(column meta data) array and rows array