<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title></title>
	<atom:link href="http://jianmingli.com/wp/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://jianmingli.com/wp</link>
	<description></description>
	<pubDate>Tue, 07 Sep 2010 13:31:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Oracle PL/SQL (10.2)</title>
		<link>http://jianmingli.com/wp/?p=1785</link>
		<comments>http://jianmingli.com/wp/?p=1785#comments</comments>
		<pubDate>Wed, 01 Sep 2010 14:46:10 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[pl/sql]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1785</guid>
		<description><![CDATA[Block Structure
&#160;
&#91;DECLARE
  -- declarations]
BEGIN
&#91;EXCEPTION
  -- handlers]
END;
&#160;
Variables
Declaring Variables
<p>* SQL data types</p>
&#160;
DECLARE
  part_no NUMBER&#40;6&#41;;
  part_name VARCHAR2&#40;20&#41;;
  in_stock BOOLEAN;
  part_price NUMBER&#40;6,2&#41;;
  part_desc VARCHAR2&#40;50&#41;;
&#160;
<p>* <a href="http://jianmingli.com/wp/?p=1785"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<h2>Block Structure</h2>
<pre class="sql">&nbsp;
<span style="color: #66cc66;">&#91;</span>DECLARE
  <span style="color: #808080; font-style: italic;">-- declarations]</span>
BEGIN
<span style="color: #66cc66;">&#91;</span>EXCEPTION
  <span style="color: #808080; font-style: italic;">-- handlers]</span>
END;
&nbsp;</pre>
<h2>Variables</h2>
<h3>Declaring Variables</h3>
<p>* SQL data types</p>
<pre class="sql">&nbsp;
DECLARE
  part_no NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span>;
  part_name VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>;
  in_stock <span style="color: #993333; font-weight: bold;">BOOLEAN</span>;
  part_price NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
  part_desc VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;</pre>
<p>* %TYPE, %ROWTYPE</p>
<pre class="sql">&nbsp;
v_last_name employees.last_name%TYPE;
dept_rec departments%ROWTYPE;
&nbsp;</pre>
<pre class="sql">&nbsp;
DECLARE
  CURSOR c1 <span style="color: #993333; font-weight: bold;">IS</span>
  <span style="color: #993333; font-weight: bold;">SELECT</span> last_name, salary, hire_date, job_id <span style="color: #993333; font-weight: bold;">FROM</span> employees
  <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = <span style="color: #cc66cc;">120</span>;
  <span style="color: #808080; font-style: italic;">-- declare record variable that represents a row fetched from the employees table</span>
  employee_rec c1%ROWTYPE;
BEGIN
  <span style="color: #808080; font-style: italic;">-- open the explicit cursor and use it to fetch data into employee_rec</span>
  OPEN c1;
  FETCH c1 <span style="color: #993333; font-weight: bold;">INTO</span> employee_rec;
  DBMS_OUTPUT.PUT_LINE<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Employee name: '</span> || employee_rec.last_name<span style="color: #66cc66;">&#41;</span>;
END;
&nbsp;</pre>
<h3>Declaring Constants</h3>
<p>Use 'CONSTANT' qualifier.</p>
<pre class="sql">&nbsp;
credit_limit CONSTANT NUMBER := <span style="color: #cc66cc;">5000.00</span>;
&nbsp;</pre>
<h3>Assign Values to Variables</h3>
<p>* Use assignment operator ':='</p>
<pre class="sql">&nbsp;
DECLARE
  wages NUMBER;
  hours_worked NUMBER := <span style="color: #cc66cc;">40</span>;
  hourly_salary NUMBER := <span style="color: #cc66cc;">22.50</span>;
  bonus NUMBER := <span style="color: #cc66cc;">150</span>;
  country VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">128</span><span style="color: #66cc66;">&#41;</span>;
  counter NUMBER := <span style="color: #cc66cc;">0</span>;
  done <span style="color: #993333; font-weight: bold;">BOOLEAN</span>;
  valid_id <span style="color: #993333; font-weight: bold;">BOOLEAN</span>;
  emp_rec1 employees%ROWTYPE;
  emp_rec2 employees%ROWTYPE;
  TYPE commissions <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF NUMBER <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #993333; font-weight: bold;">BY</span> PLS_INTEGER;
  comm_tab commissions;
&nbsp;</pre>
<p>* Use select into</p>
<pre class="sql">&nbsp;
DECLARE
  bonus NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
  emp_id NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #cc66cc;">100</span>;
BEGIN
  <span style="color: #993333; font-weight: bold;">SELECT</span> salary * <span style="color: #cc66cc;">0.10</span> <span style="color: #993333; font-weight: bold;">INTO</span> bonus <span style="color: #993333; font-weight: bold;">FROM</span> employees
  <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = emp_id;
END;</pre>
<p>* Pass values into PL/SQL as OUT or IN OUT parameters</p>
<pre class="sql">&nbsp;
DECLARE
  new_sal NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
  emp_id NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #cc66cc;">126</span>;
PROCEDURE adjust_salary<span style="color: #66cc66;">&#40;</span>emp_id NUMBER, sal <span style="color: #993333; font-weight: bold;">IN</span> OUT NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IS</span>
  emp_job VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;
  avg_sal NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;</pre>
<h3>Bind Variables</h3>
<p>Use bind variables to reuse SQL statements.</p>
<pre class="sql">&nbsp;
<span style="color: #ff0000;">'DELETE FROM employees WHERE employee_id = :id'</span> <span style="color: #993333; font-weight: bold;">USING</span> emp_id;
&nbsp;</pre>
<h2>Control Structures</h2>
<h3>IF THEN ELSE And CASE</h3>
<pre class="sql">&nbsp;
DECLARE
  jobid employees.job_id%TYPE;
  empid employees.employee_id%TYPE := <span style="color: #cc66cc;">115</span>;
  sal employees.salary%TYPE;
  sal_raise NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
BEGIN
  <span style="color: #993333; font-weight: bold;">SELECT</span> job_id, salary <span style="color: #993333; font-weight: bold;">INTO</span> jobid, sal <span style="color: #993333; font-weight: bold;">FROM</span> employees <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = empid;
  CASE
    WHEN jobid = <span style="color: #ff0000;">'PU_CLERK'</span> THEN
      <span style="color: #993333; font-weight: bold;">IF</span> sal &lt; <span style="color: #cc66cc;">3000</span> THEN sal_raise := .<span style="color: #cc66cc;">12</span>;
      ELSE sal_raise := .<span style="color: #cc66cc;">09</span>;
      END <span style="color: #993333; font-weight: bold;">IF</span>;
    WHEN jobid = <span style="color: #ff0000;">'SH_CLERK'</span> THEN
      <span style="color: #993333; font-weight: bold;">IF</span> sal &lt; <span style="color: #cc66cc;">4000</span> THEN sal_raise := .<span style="color: #cc66cc;">11</span>;
      ELSE sal_raise := .<span style="color: #cc66cc;">08</span>;
      END <span style="color: #993333; font-weight: bold;">IF</span>;
    WHEN jobid = <span style="color: #ff0000;">'ST_CLERK'</span> THEN
      <span style="color: #993333; font-weight: bold;">IF</span> sal &lt; <span style="color: #cc66cc;">3500</span> THEN sal_raise := .<span style="color: #cc66cc;">10</span>;
      ELSE sal_raise := .<span style="color: #cc66cc;">07</span>;
      END <span style="color: #993333; font-weight: bold;">IF</span>;
    ELSE
      BEGIN
        DBMS_OUTPUT.PUT_LINE<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'No raise for this job: '</span> || jobid<span style="color: #66cc66;">&#41;</span>;
      END;
  END CASE;
  <span style="color: #993333; font-weight: bold;">UPDATE</span> employees <span style="color: #993333; font-weight: bold;">SET</span> salary = salary + salary * sal_raise
    <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = empid;
  COMMIT;
END;</pre>
<h3>FOR LOOP</h3>
<pre class="sql">&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> sqr_root_sum <span style="color: #66cc66;">&#40;</span>num NUMBER, sq_root NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>,
  sqr NUMBER, sum_sqrs NUMBER<span style="color: #66cc66;">&#41;</span>;
DECLARE
  s PLS_INTEGER;
BEGIN
  <span style="color: #993333; font-weight: bold;">FOR</span> i <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #cc66cc;">1</span>..<span style="color: #cc66cc;">100</span> LOOP
    s := <span style="color: #66cc66;">&#40;</span>i * <span style="color: #66cc66;">&#40;</span>i + <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> * <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>*i <span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #cc66cc;">6</span>; <span style="color: #808080; font-style: italic;">-- sum of squares</span>
    <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> sqr_root_sum <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span>i, SQRT<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>, i*i, s <span style="color: #66cc66;">&#41;</span>;
  END LOOP;
END;</pre>
<h3>WHILE LOOP</h3>
<pre class="sql">&nbsp;
WHILE sal &lt;= <span style="color: #cc66cc;">15000</span> LOOP <span style="color: #808080; font-style: italic;">-- loop until sal &gt; 15000</span>
  <span style="color: #993333; font-weight: bold;">SELECT</span> salary, manager_id, last_name <span style="color: #993333; font-weight: bold;">INTO</span> sal, mgr_id, lname
  <span style="color: #993333; font-weight: bold;">FROM</span> employees <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = mgr_id;
END LOOP;</pre>
<h3>EXIT WHEN</h3>
<pre class="sql">&nbsp;
LOOP
  counter := counter + <span style="color: #cc66cc;">1</span>;
  total := total + counter * counter;
  <span style="color: #808080; font-style: italic;">-- exit loop when condition is true</span>
  EXIT WHEN total &gt; <span style="color: #cc66cc;">25000</span>;
END LOOP;</pre>
<h2>Subprograms: Procedures and Functions</h2>
<p>* Subprograms can be procedures and functions.<br />
- Functions can return a value, procedure not. Procedures can only have OUT parameters.<br />
- Function can be used in a select statement, procedures not.</p>
<h3>Packages</h3>
<p>* Packages related types and procedures together.<br />
* Define package</p>
<pre class="sql">&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> PACKAGE emp_actions <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #808080; font-style: italic;">-- package specification</span>
  PROCEDURE hire_employee <span style="color: #66cc66;">&#40;</span>employee_id NUMBER, last_name VARCHAR2,
    first_name VARCHAR2, email VARCHAR2, phone_number VARCHAR2,
    hire_date DATE, job_id VARCHAR2, salary NUMBER, commission_pct NUMBER,
    manager_id NUMBER, department_id NUMBER<span style="color: #66cc66;">&#41;</span>;
  PROCEDURE fire_employee <span style="color: #66cc66;">&#40;</span>emp_id NUMBER<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FUNCTION</span> num_above_salary <span style="color: #66cc66;">&#40;</span>emp_id NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURN</span> NUMBER;
END emp_actions;
/
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> PACKAGE BODY emp_actions <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #808080; font-style: italic;">-- package body</span>
  <span style="color: #808080; font-style: italic;">-- code for procedure hire_employee</span>
  PROCEDURE hire_employee <span style="color: #66cc66;">&#40;</span>employee_id NUMBER, last_name VARCHAR2,
    first_name VARCHAR2, email VARCHAR2, phone_number VARCHAR2, hire_date DATE,
    job_id VARCHAR2, salary NUMBER, commission_pct NUMBER,
    manager_id NUMBER, department_id NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IS</span>
  BEGIN
    <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> employees <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span>employee_id, last_name, first_name, email,
    phone_number, hire_date, job_id, salary, commission_pct, manager_id,
    department_id<span style="color: #66cc66;">&#41;</span>;
  END hire_employee;
&nbsp;
  <span style="color: #808080; font-style: italic;">-- code for procedure fire_employee</span>
  PROCEDURE fire_employee <span style="color: #66cc66;">&#40;</span>emp_id NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">IS</span>
    BEGIN
    <span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> employees <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = emp_id;
  END fire_employee;
&nbsp;
  <span style="color: #808080; font-style: italic;">-- code for function num_above salary</span>
  <span style="color: #993333; font-weight: bold;">FUNCTION</span> num_above_salary <span style="color: #66cc66;">&#40;</span>emp_id NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURN</span> NUMBER <span style="color: #993333; font-weight: bold;">IS</span>
    emp_sal NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span>,<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
    num_count NUMBER;
  BEGIN
    <span style="color: #993333; font-weight: bold;">SELECT</span> salary <span style="color: #993333; font-weight: bold;">INTO</span> emp_sal <span style="color: #993333; font-weight: bold;">FROM</span> employees <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = emp_id;
    <span style="color: #993333; font-weight: bold;">SELECT</span> COUNT<span style="color: #66cc66;">&#40;</span>*<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INTO</span> num_count <span style="color: #993333; font-weight: bold;">FROM</span> employees <span style="color: #993333; font-weight: bold;">WHERE</span> salary &gt; emp_sal;
    <span style="color: #993333; font-weight: bold;">RETURN</span> num_count;
  END num_above_salary;
END emp_actions;</pre>
<p>* Use package</p>
<pre class="sql">&nbsp;
CALL emp_actions.hire_employee<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">300</span>, <span style="color: #ff0000;">'Belden'</span>, <span style="color: #ff0000;">'Enrique'</span>, <span style="color: #ff0000;">'EBELDEN'</span>,
  <span style="color: #ff0000;">'555.111.2222'</span>, <span style="color: #ff0000;">'31-AUG-04'</span>, <span style="color: #ff0000;">'AC_MGR'</span>, <span style="color: #cc66cc;">9000</span>, .<span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">101</span>, <span style="color: #cc66cc;">110</span><span style="color: #66cc66;">&#41;</span>;
BEGIN
  DBMS_OUTPUT.PUT_LINE<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'Number of employees with higher salary: '</span> ||
  TO_CHAR<span style="color: #66cc66;">&#40;</span>emp_actions.num_above_salary<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">120</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  emp_actions.fire_employee<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">300</span><span style="color: #66cc66;">&#41;</span>;
END;</pre>
<h2>Data Abstraction</h2>
<h3>Cursors</h3>
<p>* Points to a private SQL area.</p>
<pre class="sql">&nbsp;
DECLARE
  CURSOR c1 <span style="color: #993333; font-weight: bold;">IS</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> last_name, salary, hire_date, job_id <span style="color: #993333; font-weight: bold;">FROM</span> employees
    <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = <span style="color: #cc66cc;">120</span>;
  <span style="color: #808080; font-style: italic;">-- declare record variable that represents a row fetched from the employees table</span>
  employee_rec c1%ROWTYPE;
BEGIN
  <span style="color: #808080; font-style: italic;">-- open the explicit cursor and use it to fetch data into employee_rec</span>
  OPEN c1;
  FETCH c1 <span style="color: #993333; font-weight: bold;">INTO</span> employee_rec;
  DBMS_OUTPUT.PUT_LINE<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Employee name: '</span> || employee_rec.last_name<span style="color: #66cc66;">&#41;</span>;
END;</pre>
<h2>Collections</h2>
<p>* Ordered group of elements, all of the same type.<br />
* Declare using TYPE definition.</p>
<h3>VARRAY</h3>
<p>* PL/SQL equivalent of an <strong>Array</strong><br />
* Can not have gaps in subscripts, i.e. is dense.</p>
<pre class="sql">&nbsp;
TYPE Calendar <span style="color: #993333; font-weight: bold;">IS</span> VARRAY<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">366</span><span style="color: #66cc66;">&#41;</span> OF DATE;</pre>
<h3>Nested Table</h3>
<p>* PL/SQL equivalent of a <strong>Set</strong><br />
* One dimension array with <strong>no </strong>declared number of elements.<br />
* Can have gaps in subscripts.<br />
* Can be stored in database column.</p>
<pre class="sql">&nbsp;
TYPE nested_type <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">30</span><span style="color: #66cc66;">&#41;</span>;</pre>
<h3>Associative Array</h3>
<p>* aka index-by tables<br />
* PL/SQL equivalent of <strong>Hashtable</strong><br />
* Can not be stored in database column.</p>
<pre class="sql">&nbsp;
DECLARE
  TYPE EmpTabTyp <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF employees%ROWTYPE
    <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #993333; font-weight: bold;">BY</span> PLS_INTEGER;
  emp_tab EmpTabTyp;
BEGIN
  <span style="color: #808080; font-style: italic;">/* Retrieve employee record. */</span>
  <span style="color: #993333; font-weight: bold;">SELECT</span> * <span style="color: #993333; font-weight: bold;">INTO</span> emp_tab<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> employees <span style="color: #993333; font-weight: bold;">WHERE</span> employee_id = <span style="color: #cc66cc;">100</span>;
END;
/</pre>
<pre class="sql">&nbsp;
DECLARE
  TYPE staff_list <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF employees.employee_id%TYPE;
  staff staff_list;
  lname employees.last_name%TYPE;
  fname employees.first_name%TYPE;
BEGIN
  staff := staff_list<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span>, <span style="color: #cc66cc;">114</span>, <span style="color: #cc66cc;">115</span>, <span style="color: #cc66cc;">120</span>, <span style="color: #cc66cc;">122</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">FOR</span> i <span style="color: #993333; font-weight: bold;">IN</span> staff.FIRST..staff.LAST LOOP
    <span style="color: #993333; font-weight: bold;">SELECT</span> last_name, first_name <span style="color: #993333; font-weight: bold;">INTO</span> lname, fname <span style="color: #993333; font-weight: bold;">FROM</span> employees
    <span style="color: #993333; font-weight: bold;">WHERE</span> employees.employee_id = staff<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
    DBMS_OUTPUT.PUT_LINE <span style="color: #66cc66;">&#40;</span> TO_CHAR<span style="color: #66cc66;">&#40;</span>staff<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> || <span style="color: #ff0000;">': '</span> || lname || <span style="color: #ff0000;">', '</span> || fname <span style="color: #66cc66;">&#41;</span>;
  END LOOP;
END;
/</pre>
<pre class="sql">&nbsp;
DECLARE
  TYPE nested_type <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">30</span><span style="color: #66cc66;">&#41;</span>;
  TYPE varray_type <span style="color: #993333; font-weight: bold;">IS</span> VARRAY<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> OF INTEGER;
  TYPE assoc_array_num_type <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF NUMBER <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #993333; font-weight: bold;">BY</span> PLS_INTEGER;
  TYPE assoc_array_str_type <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #993333; font-weight: bold;">BY</span> PLS_INTEGER;
  TYPE assoc_array_str_type2 <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">TABLE</span> OF VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #993333; font-weight: bold;">BY</span> VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#41;</span>;
  v1 nested_type;
  v2 varray_type;
  v3 assoc_array_num_type;
  v4 assoc_array_str_type;
  v5 assoc_array_str_type2;
BEGIN
  <span style="color: #808080; font-style: italic;">-- an arbitrary number of strings can be inserted v1</span>
  v1 := nested_type<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Shipping'</span>,<span style="color: #ff0000;">'Sales'</span>,<span style="color: #ff0000;">'Finance'</span>,<span style="color: #ff0000;">'Payroll'</span><span style="color: #66cc66;">&#41;</span>;
  v2 := varray_type<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span>, <span style="color: #cc66cc;">4</span>, <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">-- Up to 5 integers</span>
  v3<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">99</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #cc66cc;">10</span>; <span style="color: #808080; font-style: italic;">-- Just start assigning to elements</span>
  Defining Collection Types <span style="color: #993333; font-weight: bold;">AND</span> Declaring Collection <span style="color: #993333; font-weight: bold;">VARIABLES</span>
  <span style="color: #cc66cc;">5</span><span style="color: #cc66cc;">-8</span> Oracle <span style="color: #993333; font-weight: bold;">DATABASE</span> PL/SQL User’s Guide <span style="color: #993333; font-weight: bold;">AND</span> Reference
  v3<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #cc66cc;">100</span>; <span style="color: #808080; font-style: italic;">-- Subscripts can be any integer values</span>
  v4<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">42</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #ff0000;">'Smith'</span>; <span style="color: #808080; font-style: italic;">-- Just start assigning to elements</span>
  v4<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">54</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #ff0000;">'Jones'</span>; <span style="color: #808080; font-style: italic;">-- Subscripts can be any integer values</span>
  v5<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Canada'</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #ff0000;">'North America'</span>; <span style="color: #808080; font-style: italic;">-- Just start assigning to elements</span>
  v5<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Greece'</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #ff0000;">'Europe'</span>; <span style="color: #808080; font-style: italic;">-- Subscripts can be string values</span>
END;</pre>
<h3>Records</h3>
<p>* Composite data structures (like C struct)<br />
* Fields can have different data types.<br />
* Use %ROWTYPE to declare a record that represents a row in a table.</p>
<pre class="sql">&nbsp;
DECLARE
  TYPE timerec <span style="color: #993333; font-weight: bold;">IS</span> RECORD <span style="color: #66cc66;">&#40;</span>hours SMALLINT, minutes SMALLINT<span style="color: #66cc66;">&#41;</span>;
  TYPE meetin_typ <span style="color: #993333; font-weight: bold;">IS</span> RECORD <span style="color: #66cc66;">&#40;</span>
    date_held DATE,
    duration timerec, <span style="color: #808080; font-style: italic;">-- nested record</span>
    location VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>,
    purpose VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
BEGIN
  <span style="color: #808080; font-style: italic;">-- NULL does nothing but allows unit to be compiled and tested</span>
  <span style="color: #993333; font-weight: bold;">NULL</span>;
END;
/</pre>
<h3>Object Types</h3>
<p>* Contains both data (attributes) and functions (methods).</p>
<pre class="sql">&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> TYPE bank_account <span style="color: #993333; font-weight: bold;">AS</span> OBJECT <span style="color: #66cc66;">&#40;</span>
  acct_number NUMBER<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>,
  balance NUMBER,
  <span style="color: #993333; font-weight: bold;">STATUS</span> VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>,
&nbsp;
  MEMBER PROCEDURE open <span style="color: #66cc66;">&#40;</span>SELF <span style="color: #993333; font-weight: bold;">IN</span> OUT NOCOPY bank_account, amount <span style="color: #993333; font-weight: bold;">IN</span> NUMBER<span style="color: #66cc66;">&#41;</span>,
  MEMBER PROCEDURE close <span style="color: #66cc66;">&#40;</span>SELF <span style="color: #993333; font-weight: bold;">IN</span> OUT NOCOPY bank_account, num <span style="color: #993333; font-weight: bold;">IN</span> NUMBER, amount OUT NUMBER<span style="color: #66cc66;">&#41;</span>,
  MEMBER PROCEDURE deposit <span style="color: #66cc66;">&#40;</span>SELF <span style="color: #993333; font-weight: bold;">IN</span> OUT NOCOPY bank_account, num <span style="color: #993333; font-weight: bold;">IN</span> NUMBER, amount <span style="color: #993333; font-weight: bold;">IN</span> NUMBER<span style="color: #66cc66;">&#41;</span>,
  MEMBER PROCEDURE withdraw <span style="color: #66cc66;">&#40;</span>SELF <span style="color: #993333; font-weight: bold;">IN</span> OUT NOCOPY bank_account, num <span style="color: #993333; font-weight: bold;">IN</span> NUMBER, amount <span style="color: #993333; font-weight: bold;">IN</span> NUMBER<span style="color: #66cc66;">&#41;</span>,
  MEMBER <span style="color: #993333; font-weight: bold;">FUNCTION</span> curr_bal <span style="color: #66cc66;">&#40;</span>num <span style="color: #993333; font-weight: bold;">IN</span> NUMBER<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURN</span> NUMBER <span style="color: #66cc66;">&#41;</span>;
/</pre>
<h3>Exceptions</h3>
<p>* Use RAISE statement to throw user defined exceptions.<br />
* Use EXCEPTION to catch the exceptions.</p>
<pre class="sql">&nbsp;
EXCEPTION <span style="color: #808080; font-style: italic;">-- exception-handling part starts here</span>
  WHEN comm_missing THEN
    DBMS_OUTPUT.PUT_LINE<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'This employee does not receive a commission.'</span><span style="color: #66cc66;">&#41;</span>;
    commission := <span style="color: #cc66cc;">0</span>;
  WHEN OTHERS THEN
    <span style="color: #993333; font-weight: bold;">NULL</span>; <span style="color: #808080; font-style: italic;">-- for other exceptions do nothing</span></pre>
<h2>References</h2>
<p>* <a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261.pdf">PL/SQL User's Guide and Reference 10g Release 2 (10.2)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1785</wfw:commentRss>
		</item>
		<item>
		<title>XML Naming Conventions</title>
		<link>http://jianmingli.com/wp/?p=1783</link>
		<comments>http://jianmingli.com/wp/?p=1783#comments</comments>
		<pubDate>Tue, 31 Aug 2010 15:51:56 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1783</guid>
		<description><![CDATA[<p>Here is great page summarizing various XML related naming specifications.
* Use of Camel Case for Naming XML and XML-Related Components
* FEDERAL XML NAMING AND DESIGN RULES
* Global <a href="http://jianmingli.com/wp/?p=1783"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Here is great page summarizing various XML related naming specifications.<br />
* <a href="http://xml.coverpages.org/camelCase.html">Use of Camel Case for Naming XML and XML-Related Components</a><br />
* <a href="http://xml.coverpages.org/Federal-NDR-20050609.pdf">FEDERAL XML NAMING AND DESIGN RULES</a><br />
* <a href="http://xml.coverpages.org/GJXDM-NDR-20050823.pdf">Global Justice XML Data Model Naming and Design Rules</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1783</wfw:commentRss>
		</item>
		<item>
		<title>CYA 2010 Fall U10B Soccer</title>
		<link>http://jianmingli.com/wp/?p=1777</link>
		<comments>http://jianmingli.com/wp/?p=1777#comments</comments>
		<pubDate>Tue, 31 Aug 2010 13:41:52 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[soccer]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1777</guid>
		<description><![CDATA[Players
<p>* Anirudh
* Sam
* Joseph
* Justin
* Collin
* James
* Kenan
* CJ
* Gabriel
* Richard
* Patrick </p>
Weekly Practices
<p>* Time: Mondays and Wednesdays from 6:30 - 8:00pm.
* Location: EDS field near the <a href="http://jianmingli.com/wp/?p=1777"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<h2>Players</h2>
<p>* Anirudh<br />
* Sam<br />
* Joseph<br />
* Justin<br />
* Collin<br />
* James<br />
* Kenan<br />
* CJ<br />
* Gabriel<br />
* Richard<br />
* Patrick </p>
<h2>Weekly Practices</h2>
<p>* Time: Mondays and Wednesdays from 6:30 - 8:00pm.<br />
* Location: EDS field near the Wall Rd.</p>
<h2>Game Schedule</h2>
<p>* 9/11/2010: 10:15 am<br />
* 9/18/2010: 10:15 am<br />
* 9/25/2010: 11:30 am<br />
* 10/2/2010: 10:15 am		</p>
<p>* 10/16/2010: 9:00 am	(Line the field)<br />
* 10/23/2010: 11:30 am<br />
* 10/30/2010: 10:15 am<br />
* 11/6/2010: 9:00 am	</p>
<h2>Please Bring</h2>
<p>* Soccer cleats<br />
* Shinguard<br />
* Soccer socks<br />
* Size 4 soccer ball<br />
* Uniform<br />
* Water bottles<br />
* Sun screen</p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1777</wfw:commentRss>
		</item>
		<item>
		<title>Oracle AQ</title>
		<link>http://jianmingli.com/wp/?p=1487</link>
		<comments>http://jianmingli.com/wp/?p=1487#comments</comments>
		<pubDate>Fri, 27 Aug 2010 19:09:06 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1487</guid>
		<description><![CDATA[Getting Started
Create Users
&#160;
CONNECT system/manager;
DROP USER aqadm CASCADE;
CREATE USER aqadm IDENTIFIED BY aqadm;
GRANT CONNECT, RESOURCE TO aqadm;
GRANT EXECUTE ON DBMS_AQADM TO aqadm;
GRANT Aq_administrator_role TO aqadm;
&#160;
DROP USER aq CASCADE;
CREATE <a href="http://jianmingli.com/wp/?p=1487"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<h2>Getting Started</h2>
<h3>Create Users</h3>
<pre class="sql">&nbsp;
CONNECT system/manager;
<span style="color: #993333; font-weight: bold;">DROP</span> USER aqadm CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> USER aqadm <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> aqadm;
<span style="color: #993333; font-weight: bold;">GRANT</span> CONNECT, RESOURCE <span style="color: #993333; font-weight: bold;">TO</span> aqadm;
<span style="color: #993333; font-weight: bold;">GRANT</span> EXECUTE <span style="color: #993333; font-weight: bold;">ON</span> DBMS_AQADM <span style="color: #993333; font-weight: bold;">TO</span> aqadm;
<span style="color: #993333; font-weight: bold;">GRANT</span> Aq_administrator_role <span style="color: #993333; font-weight: bold;">TO</span> aqadm;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> USER aq CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> USER aq <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> aq;
<span style="color: #993333; font-weight: bold;">GRANT</span> CONNECT, RESOURCE <span style="color: #993333; font-weight: bold;">TO</span> aq;
<span style="color: #993333; font-weight: bold;">GRANT</span> EXECUTE <span style="color: #993333; font-weight: bold;">ON</span> dbms_aq <span style="color: #993333; font-weight: bold;">TO</span> aq;
<span style="color: #993333; font-weight: bold;">GRANT</span> EXECUTE <span style="color: #993333; font-weight: bold;">ON</span> dbms_aqadm <span style="color: #993333; font-weight: bold;">TO</span> aq;
&nbsp;</pre>
<h3>Create Q Table and Q of Object Type</h3>
<pre class="sql">&nbsp;
connect aq/aq;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> type aq.Message_typ <span style="color: #993333; font-weight: bold;">AS</span> object <span style="color: #66cc66;">&#40;</span>
subject VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">30</span><span style="color: #66cc66;">&#41;</span>,
text VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
/
&nbsp;
begin
  DBMS_AQADM.CREATE_QUEUE_TABLE <span style="color: #66cc66;">&#40;</span>
  queue_table =&gt; <span style="color: #ff0000;">'aq.objmsgs80_qtab'</span>,
  queue_payload_type =&gt; <span style="color: #ff0000;">'aq.Message_typ'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
   DBMS_AQADM.CREATE_QUEUE <span style="color: #66cc66;">&#40;</span>
  queue_name =&gt; <span style="color: #ff0000;">'msg_queue'</span>,
  queue_table =&gt; <span style="color: #ff0000;">'aq.objmsgs80_qtab'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
   DBMS_AQADM.START_QUEUE <span style="color: #66cc66;">&#40;</span>
  queue_name =&gt; <span style="color: #ff0000;">'msg_queue'</span><span style="color: #66cc66;">&#41;</span>;
end;
/
&nbsp;</pre>
<h3>Create a Q Table and Q of Raw Type</h3>
<pre class="sql">&nbsp;
begin
  DBMS_AQADM.CREATE_QUEUE_TABLE <span style="color: #66cc66;">&#40;</span>
  queue_table =&gt; <span style="color: #ff0000;">'aq.RawMsgs_qtab'</span>,
  queue_payload_type =&gt; <span style="color: #ff0000;">'RAW'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  DBMS_AQADM.CREATE_QUEUE <span style="color: #66cc66;">&#40;</span>
  queue_name =&gt; <span style="color: #ff0000;">'raw_msg_queue'</span>,
  queue_table =&gt; <span style="color: #ff0000;">'aq.RawMsgs_qtab'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  DBMS_AQADM.START_QUEUE <span style="color: #66cc66;">&#40;</span>
  queue_name =&gt; <span style="color: #ff0000;">'raw_msg_queue'</span><span style="color: #66cc66;">&#41;</span>;
end;
/
&nbsp;</pre>
<h3>Create a Prioritized Message Q Table and Q</h3>
<pre class="sql">&nbsp;
begin
  DBMS_AQADM.CREATE_QUEUE_TABLE <span style="color: #66cc66;">&#40;</span>
  queue_table =&gt; <span style="color: #ff0000;">'aq.priority_msg'</span>,
  sort_list =&gt; <span style="color: #ff0000;">'PRIORITY,ENQ_TIME'</span>,
  queue_payload_type =&gt; <span style="color: #ff0000;">'aq.Message_typ'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  DBMS_AQADM.CREATE_QUEUE <span style="color: #66cc66;">&#40;</span>
  queue_name =&gt; <span style="color: #ff0000;">'priority_msg_queue'</span>,
  queue_table =&gt; <span style="color: #ff0000;">'aq.priority_msg'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  DBMS_AQADM.START_QUEUE <span style="color: #66cc66;">&#40;</span>
  queue_name =&gt; <span style="color: #ff0000;">'priority_msg_queue'</span><span style="color: #66cc66;">&#41;</span>;
end;
/
&nbsp;</pre>
<h3>Drop Queue</h3>
<pre class="sql">&nbsp;
begin
   DBMS_AQADM.STOP_QUEUE<span style="color: #66cc66;">&#40;</span>
      queue_name =&gt; <span style="color: #ff0000;">'TEST_QUEUE'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
   DBMS_AQADM.DROP_QUEUE<span style="color: #66cc66;">&#40;</span>
      Queue_name =&gt; <span style="color: #ff0000;">'TEST_QUEUE'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
   DBMS_AQADM.DROP_QUEUE_TABLE<span style="color: #66cc66;">&#40;</span>
        Queue_table =&gt; <span style="color: #ff0000;">'TEST_QUEUE_TAB'</span><span style="color: #66cc66;">&#41;</span>;
END;</pre>
<h1>References</h1>
<p>* <a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10785.pdf">Oracle® Streams Advanced Queuing User's Guide and Reference Release 10.1 Part No. B10785-01</a><br />
* <a href="http://www.akadia.com/services/ora_advanced_queueing.html">http://www.akadia.com/services/ora_advanced_queueing.html</a><br />
* <a href="http://forums.oracle.com/forums/thread.jspa?threadID=376424&tstart=15">AQ vs JMS</a><br />
* <a href="http://psoug.org/reference/dbms_aqadm.html">Oracle DBMS_AQADM</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1487</wfw:commentRss>
		</item>
		<item>
		<title>Generate XML Schema from oracle tables</title>
		<link>http://jianmingli.com/wp/?p=1772</link>
		<comments>http://jianmingli.com/wp/?p=1772#comments</comments>
		<pubDate>Thu, 26 Aug 2010 15:52:01 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1772</guid>
		<description><![CDATA[<p>Here is a nice thread describing how to generate XML schema from Oracle tables. I tried the following function and it worked great.</p>
<p>* Compile the following PL/SQL <a href="http://jianmingli.com/wp/?p=1772"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://forums.oracle.com/forums/thread.jspa?messageID=1515908">Here </a>is a nice thread describing how to generate XML schema from Oracle tables. I tried the following function and it worked great.</p>
<p>* Compile the following PL/SQL function:</p>
<pre class="sql">&nbsp;
<span style="color: #993333; font-weight: bold;">FUNCTION</span> GEN_XML_SCHEMA<span style="color: #66cc66;">&#40;</span>target_table varchar2<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURN</span> xmltype
<span style="color: #993333; font-weight: bold;">AS</span>
  xmlSchema XMLTYPE;
begin
  <span style="color: #993333; font-weight: bold;">SELECT</span>
    xmlElement<span style="color: #66cc66;">&#40;</span>
      <span style="color: #ff0000;">&quot;xsd:schema&quot;</span>,
      xmlAttributes<span style="color: #66cc66;">&#40;</span>
        <span style="color: #ff0000;">'http://www.w3.org/2001/XMLSchema'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xmlns:xsd&quot;</span>,
        <span style="color: #ff0000;">'http://xmlns.oracle.com/xdb'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xmlns:xdb&quot;</span>,
        <span style="color: #ff0000;">'http://'</span> || target_table || <span style="color: #ff0000;">'/xsd'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;targetNamespace&quot;</span>,
        <span style="color: #ff0000;">'http://'</span> || target_table || <span style="color: #ff0000;">'/xsd'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xmlns:tns&quot;</span>,
        <span style="color: #ff0000;">'qualified'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;elementFormDefault&quot;</span>
      <span style="color: #66cc66;">&#41;</span>,
      xmlElement<span style="color: #66cc66;">&#40;</span>
        <span style="color: #ff0000;">&quot;xsd:element&quot;</span>,
        xmlAttributes<span style="color: #66cc66;">&#40;</span>
          table_name || <span style="color: #ff0000;">'S'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>,
          <span style="color: #ff0000;">'tns:'</span> || table_name || <span style="color: #ff0000;">'S_T'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;type&quot;</span>
        <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>,
      xmlElement<span style="color: #66cc66;">&#40;</span>
        <span style="color: #ff0000;">&quot;xsd:complexType&quot;</span>,
        xmlAttributes <span style="color: #66cc66;">&#40;</span>
          table_name || <span style="color: #ff0000;">'S_T'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>
        <span style="color: #66cc66;">&#41;</span>,
        xmlElement <span style="color: #66cc66;">&#40;</span>
          <span style="color: #ff0000;">&quot;xsd:sequence&quot;</span>,
          xmlElement <span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;xsd:element&quot;</span>,
            xmlAttributes <span style="color: #66cc66;">&#40;</span>
              table_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>,
              <span style="color: #ff0000;">'tns:'</span> || table_name || <span style="color: #ff0000;">'_T'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;type&quot;</span>,
              <span style="color: #ff0000;">'unbounded'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;maxOccurs&quot;</span>
            <span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>,
      xmlElement <span style="color: #66cc66;">&#40;</span>
        <span style="color: #ff0000;">&quot;xsd:complexType&quot;</span>,
        xmlAttributes <span style="color: #66cc66;">&#40;</span>
          table_name || <span style="color: #ff0000;">'_T'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>
        <span style="color: #66cc66;">&#41;</span>,
        xmlElement <span style="color: #66cc66;">&#40;</span>
          <span style="color: #ff0000;">&quot;xsd:sequence&quot;</span>,
          <span style="color: #66cc66;">&#40;</span>
            xmlAgg<span style="color: #66cc66;">&#40;</span>ELEMENT<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">INTO</span> xmlSchema
  <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> TABLE_NAME, INTERNAL_COLUMN_ID,
      case
        when DATA_TYPE <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'VARCHAR2'</span>, <span style="color: #ff0000;">'CHAR'</span><span style="color: #66cc66;">&#41;</span> then
          xmlElement <span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;xsd:element&quot;</span>,
            xmlattributes <span style="color: #66cc66;">&#40;</span>
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>,
              decode<span style="color: #66cc66;">&#40;</span>NULLABLE, <span style="color: #ff0000;">'Y'</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;minOccurs&quot;</span>,
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLName&quot;</span>,
              DATA_TYPE <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLTYPE&quot;</span>
            <span style="color: #66cc66;">&#41;</span>,
            xmlElement <span style="color: #66cc66;">&#40;</span>
              <span style="color: #ff0000;">&quot;xsd:simpleType&quot;</span>,
              xmlElement <span style="color: #66cc66;">&#40;</span>
                <span style="color: #ff0000;">&quot;xsd:restriction&quot;</span>,
                xmlAttributes <span style="color: #66cc66;">&#40;</span>
                  <span style="color: #ff0000;">'xsd:string'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;base&quot;</span>
                <span style="color: #66cc66;">&#41;</span>,
                xmlElement <span style="color: #66cc66;">&#40;</span>
                  <span style="color: #ff0000;">&quot;xsd:maxLength&quot;</span>,
                  xmlAttributes <span style="color: #66cc66;">&#40;</span>
                  DATA_LENGTH <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;value&quot;</span>
                  <span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
        when DATA_TYPE = <span style="color: #ff0000;">'DATE'</span> then
          xmlElement <span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;xsd:element&quot;</span>,
            xmlattributes <span style="color: #66cc66;">&#40;</span>
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>,
              <span style="color: #808080; font-style: italic;">--'xsd:dateTime' as &quot;type&quot;,</span>
              <span style="color: #ff0000;">'xsd:date'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;type&quot;</span>,
              decode<span style="color: #66cc66;">&#40;</span>NULLABLE, <span style="color: #ff0000;">'Y'</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;minOccurs&quot;</span>,
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLName&quot;</span>,
              DATA_TYPE <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLTYPE&quot;</span>
            <span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
        when DATA_TYPE = <span style="color: #ff0000;">'NUMBER'</span> then
          xmlElement <span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;xsd:element&quot;</span>,
            xmlattributes <span style="color: #66cc66;">&#40;</span>
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>,
              decode<span style="color: #66cc66;">&#40;</span>DATA_SCALE, <span style="color: #cc66cc;">0</span>, <span style="color: #ff0000;">'xsd:integer'</span>, <span style="color: #ff0000;">'xsd:double'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;type&quot;</span>,
              decode<span style="color: #66cc66;">&#40;</span>NULLABLE, <span style="color: #ff0000;">'Y'</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;minOccurs&quot;</span>,
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLName&quot;</span>,
              DATA_TYPE <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLTYPE&quot;</span>
            <span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
        else
          xmlElement <span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;xsd:element&quot;</span>,
            xmlattributes <span style="color: #66cc66;">&#40;</span>
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;name&quot;</span>,
              <span style="color: #ff0000;">'xsd:anySimpleType'</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;type&quot;</span>,
              decode<span style="color: #66cc66;">&#40;</span>NULLABLE, <span style="color: #ff0000;">'Y'</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;minOccurs&quot;</span>,
              column_name <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLName&quot;</span>,
              DATA_TYPE <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;xdb:SQLTYPE&quot;</span>
            <span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
      end ELEMENT
    <span style="color: #993333; font-weight: bold;">FROM</span> user_tab_cols c
    <span style="color: #993333; font-weight: bold;">WHERE</span> TABLE_NAME = target_table
    <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> internal_column_id
  <span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> TABLE_NAME;
&nbsp;
  <span style="color: #993333; font-weight: bold;">RETURN</span> xmlSchema;
end;
&nbsp;</pre>
<p>* Run the function:</p>
<pre class="sql">&nbsp;
<span style="color: #808080; font-style: italic;">-- Complete schema</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> gen_xml_schema<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'MY_TABLE'</span><span style="color: #66cc66;">&#41;</span>.extract<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/*'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> dual;
&nbsp;
<span style="color: #808080; font-style: italic;">-- Select element and complexType</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> gen_xml_schema<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'RF_TAG_TXN'</span><span style="color: #66cc66;">&#41;</span>.extract<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/schema/element | /schema/complexType'</span>,
<span style="color: #ff0000;">'xmlns=&quot;http://www.w3.org/2001/XMLSchema&quot;'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> dual;
&nbsp;</pre>
<p>* Generate schema from multiple tables:</p>
<pre class="sql">&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> DIRECTORY dir_temp <span style="color: #993333; font-weight: bold;">AS</span>
    <span style="color: #ff0000;">'C:<span style="color: #000099; font-weight: bold;">\T</span>EMP'</span>;
&nbsp;
DECLARE
  TYPE tableNameArray <span style="color: #993333; font-weight: bold;">IS</span> varray<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> of VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#41;</span>;
  tableNames tableNameArray;
&nbsp;
  outputFileName VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #ff0000;">'MY_SCHEMA.xsd'</span>;
  outputFileHandler UTL_FILE.file_type;
&nbsp;
  tableXmlType xmlType;
  xmlRootElementBegin VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">500</span><span style="color: #66cc66;">&#41;</span> :=
    <span style="color: #ff0000;">'&lt;xsd:schema xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;
    xmlns:xdb=&quot;http://xmlns.oracle.com/xdb&quot;
    targetNamespace=&quot;http://my.db/xsd&quot;
    xmlns:tns=&quot;http://my.db/xsd&quot;
    elementFormDefault=&quot;qualified&quot;&gt;'</span>;
  xmlRootElementEnd VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">500</span><span style="color: #66cc66;">&#41;</span> := <span style="color: #ff0000;">'&lt;/xsd:schema&gt;'</span>;
BEGIN
  <span style="color: #808080; font-style: italic;">-- Database tables</span>
  tableNames := tableNameArray<span style="color: #66cc66;">&#40;</span>
    <span style="color: #ff0000;">'TABLE1'</span>,
    <span style="color: #ff0000;">'TABLE2'</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">-- Open schema file to write</span>
  outputFileHandler := UTL_FILE.fopen<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'DIR_TEMP'</span>, outputFileName, <span style="color: #ff0000;">'W'</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #808080; font-style: italic;">-- Write root element begin tag</span>
  UTL_FILE.put_line<span style="color: #66cc66;">&#40;</span>outputFileHandler, xmlRootElementBegin<span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">-- Loop through all tables</span>
  <span style="color: #993333; font-weight: bold;">FOR</span> tblName <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #cc66cc;">1</span> .. tableNames.count loop
    DBMS_OUTPUT.put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Processing table: '</span> || tableNames<span style="color: #66cc66;">&#40;</span>tblName<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">-- Generate xml schema from each table</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> gen_xml_schema<span style="color: #66cc66;">&#40;</span>tableNames<span style="color: #66cc66;">&#40;</span>tblName<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.extract<span style="color: #66cc66;">&#40;</span>
        <span style="color: #ff0000;">'/schema/element|/schema/complexType'</span>,
        <span style="color: #ff0000;">'xmlns=&quot;http://www.w3.org/2001/XMLSchema&quot;'</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold;">INTO</span> tableXmlType
    <span style="color: #993333; font-weight: bold;">FROM</span> dual;
&nbsp;
    <span style="color: #808080; font-style: italic;">-- Write xml schema</span>
    <span style="color: #993333; font-weight: bold;">IF</span> tableXmlType <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> THEN
      UTL_FILE.put_line<span style="color: #66cc66;">&#40;</span>outputFileHandler, tableXmlType.getStringVal<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
    END <span style="color: #993333; font-weight: bold;">IF</span>;
  END loop;
&nbsp;
  <span style="color: #808080; font-style: italic;">-- Write root element end tag</span>
  UTL_FILE.put_line<span style="color: #66cc66;">&#40;</span>outputFileHandler, xmlRootElementEnd<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #808080; font-style: italic;">-- Close file</span>
  UTL_FILE.fclose<span style="color: #66cc66;">&#40;</span>outputFileHandler<span style="color: #66cc66;">&#41;</span>;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line <span style="color: #66cc66;">&#40;</span>DBMS_UTILITY.FORMAT_ERROR_STACK<span style="color: #66cc66;">&#41;</span>;
END;
/</pre>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1772</wfw:commentRss>
		</item>
		<item>
		<title>Update All Fields in Word 2007</title>
		<link>http://jianmingli.com/wp/?p=1767</link>
		<comments>http://jianmingli.com/wp/?p=1767#comments</comments>
		<pubDate>Fri, 20 Aug 2010 17:54:10 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[word]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1767</guid>
		<description><![CDATA[<p>* Press Control A
* Press F9
* Save</p>
]]></description>
			<content:encoded><![CDATA[<p>* Press Control A<br />
* Press F9<br />
* Save</p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1767</wfw:commentRss>
		</item>
		<item>
		<title>WordPress Plugins</title>
		<link>http://jianmingli.com/wp/?p=1763</link>
		<comments>http://jianmingli.com/wp/?p=1763#comments</comments>
		<pubDate>Wed, 18 Aug 2010 15:32:03 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1763</guid>
		<description><![CDATA[Install
<p>* Download plugin.
* Unzip if necessary.
* Upload plugin root folder to '/wp-content/plugins/' directory.
* Login WordPress as admin, click the 'Plugins' link to go to the plugin page.
* <a href="http://jianmingli.com/wp/?p=1763"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<h2>Install</h2>
<p>* Download plugin.<br />
* Unzip if necessary.<br />
* Upload plugin root folder to '/wp-content/plugins/' directory.<br />
* Login WordPress as admin, click the 'Plugins' link to go to the plugin page.<br />
* Activate the plugin by clicking the 'Activate' link to the right of the plugin entry.<br />
* Optionally, configure the plugins.</p>
<h2>Plugins Used in This Site</h2>
<p>* <a href="http://wordpress.org/extend/plugins/code-highlighter/">CodeHighlighter</a><br />
* <a href="http://wordpress.org/extend/plugins/si-captcha-for-wordpress/">SI CAPTCHA Anti-Spam</a><br />
* <a href="http://www.zirona.com/software/wordpress-advanced-search/">Advanced Search</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1763</wfw:commentRss>
		</item>
		<item>
		<title>A Simple Java TLV Parser</title>
		<link>http://jianmingli.com/wp/?p=1756</link>
		<comments>http://jianmingli.com/wp/?p=1756#comments</comments>
		<pubDate>Mon, 16 Aug 2010 17:16:33 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1756</guid>
		<description><![CDATA[<p>* Read here for an explanation of TLV.
* In the following sample code, all found tag values are returned as a byte array containing individual tag values, <a href="http://jianmingli.com/wp/?p=1756"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>* Read <a href="http://en.wikipedia.org/wiki/Type-length-value">here </a>for an explanation of TLV.<br />
* In the following sample code, all found tag values are returned as a byte array containing individual tag values, each of which is itself a byte array.</p>
<pre class="java">&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     * Reads TLV values for a given hex string.
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> readTLV<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> tlvHexString, <span style="color: #993333;">int</span> tag<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> readTLV<span style="color: #66cc66;">&#40;</span>hexStringToByteArray<span style="color: #66cc66;">&#40;</span>tlvHexString<span style="color: #66cc66;">&#41;</span>, tag<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     * Reads TLV values for a given byte array.
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> readTLV<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> tlv, <span style="color: #993333;">int</span> tag<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>tlv == <span style="color: #000000; font-weight: bold;">null</span> || tlv.<span style="color: #006600;">length</span> &lt; <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIllegalArgumentException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">IllegalArgumentException</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Invalid TLV&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #993333;">int</span> c = <span style="color: #cc66cc;">0</span>;
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AArrayList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ArrayList</span></a> al = <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AArrayList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ArrayList</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AByteArrayInputStream+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ByteArrayInputStream</span></a> is = <span style="color: #000000; font-weight: bold;">null</span>;
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #66cc66;">&#123;</span>
             is = <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AByteArrayInputStream+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ByteArrayInputStream</span></a><span style="color: #66cc66;">&#40;</span>tlv<span style="color: #66cc66;">&#41;</span>;
&nbsp;
             <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>c = is.<span style="color: #006600;">read</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>c == tag<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
                    log.<span style="color: #006600;">debug</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Got tag&quot;</span><span style="color: #66cc66;">&#41;</span>;
                    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>c = is.<span style="color: #006600;">read</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> != <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
                        <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> value = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span>c<span style="color: #66cc66;">&#93;</span>;
                        is.<span style="color: #006600;">read</span><span style="color: #66cc66;">&#40;</span>value,<span style="color: #cc66cc;">0</span>,c<span style="color: #66cc66;">&#41;</span>;
                        al.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>value<span style="color: #66cc66;">&#41;</span>;
                    <span style="color: #66cc66;">&#125;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span> <span style="color: #000000; font-weight: bold;">finally</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>is != <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">try</span><span style="color: #66cc66;">&#123;</span>
                    is.<span style="color: #006600;">close</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
                <span style="color: #66cc66;">&#125;</span><span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIOException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">IOException</span></a> e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
                    log.<span style="color: #006600;">error</span><span style="color: #66cc66;">&#40;</span>e<span style="color: #66cc66;">&#41;</span>;
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
        log.<span style="color: #006600;">debug</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Got &quot;</span> + al.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; values for tag &quot;</span>
            + <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Integer</span></a>.<span style="color: #006600;">toHexString</span><span style="color: #66cc66;">&#40;</span>tag<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> vals = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span>al.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>;
        al.<span style="color: #006600;">toArray</span><span style="color: #66cc66;">&#40;</span>vals<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #000000; font-weight: bold;">return</span> vals;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     * Converts a hex string to byte array.
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> hexStringToByteArray<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> s<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #993333;">int</span> len = s.<span style="color: #006600;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> data = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #993333;">byte</span><span style="color: #66cc66;">&#91;</span>len / <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span>;
        <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> i = <span style="color: #cc66cc;">0</span>; i &lt; len; i += <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            data<span style="color: #66cc66;">&#91;</span>i / <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">byte</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ACharacter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Character</span></a>.<span style="color: #006600;">digit</span><span style="color: #66cc66;">&#40;</span>s.<span style="color: #006600;">charAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>, <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">&#41;</span> &lt;&lt; <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
                                 + <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ACharacter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Character</span></a>.<span style="color: #006600;">digit</span><span style="color: #66cc66;">&#40;</span>s.<span style="color: #006600;">charAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">return</span> data;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1756</wfw:commentRss>
		</item>
		<item>
		<title>OWSM Faultstring: Http status code: 404</title>
		<link>http://jianmingli.com/wp/?p=1751</link>
		<comments>http://jianmingli.com/wp/?p=1751#comments</comments>
		<pubDate>Thu, 12 Aug 2010 13:36:42 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[bpel]]></category>

		<category><![CDATA[errors]]></category>

		<category><![CDATA[oc4j]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1751</guid>
		<description><![CDATA[Scenario
<p>An Oracle BPEL application was virtualized in WSM. When the virtualized service was tested, an "Http status code: 404" fault was encounterred .</p>
Error Message
&#160;
&#60;faultcode xmlns=&#34;http://schemas.oblix.com/ws/2003/08/Faults&#34;&#62;Client.UndeliverableFault&#60;/faultcode&#62;
&#60;faultstring&#62;Http status code: <a href="http://jianmingli.com/wp/?p=1751"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<h3>Scenario</h3>
<p>An Oracle BPEL application was virtualized in WSM. When the virtualized service was tested, an "Http status code: 404" fault was encounterred .</p>
<h3>Error Message</h3>
<pre class="xml">&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;faultcode</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.oblix.com/ws/2003/08/Faults&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>Client.UndeliverableFault<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/faultcode<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;faultstring<span style="font-weight: bold; color: black;">&gt;</span></span></span>Http status code: 404<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/faultstring<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>
<h3>Diagnosis</h3>
<p>* Checked gateway log file (OracleAS_2\j2ee\oc4j_soa\log\gateway.log) and found:<br />
<em>The requested URL /MyService/MySoapHttpPort was not found on this server.</em><br />
* Viewed Messenger Step for Service: SID0003005 (Policy Management -> Register Services -> Services -> Click "View Details" icon -> Click "View Protocol Parameters" link) and found the HTTP Messenger URL property is set to:<br />
<em>http://localhost/MyService/MySoapHttpPort</em> </p>
<h3>Cause</h3>
<p>* In BPEL application, "Client" partner link's WSDL imports an existing WSDL document which contains the offending dummy soap:address. During virtualization, WSM incorrectly uses it in HTTP Messenger URL.</p>
<h3>Solution 1</h3>
<p>* Modify HTTP Messenger URL property and point to the correct physical service endpoint<br />
(Policy Management -> Register Services -> Services -> Click "Edit" icon -> Click "--> Modify Protocol Parameters" link)<br />
* Save -> Save -> OK -> commit -> OK</p>
<h3>Solution 2</h3>
<p>* Remove the &lt;service&gt; section from the imported WSDL.<br />
* Revirtualize the service.<br />
* Caveat: you'll get a new SID</p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1751</wfw:commentRss>
		</item>
		<item>
		<title>Oracle BPEL Process Resiliency</title>
		<link>http://jianmingli.com/wp/?p=1743</link>
		<comments>http://jianmingli.com/wp/?p=1743#comments</comments>
		<pubDate>Tue, 10 Aug 2010 18:08:56 +0000</pubDate>
		<dc:creator>Jianming Li</dc:creator>
		
		<category><![CDATA[bpel]]></category>

		<category><![CDATA[oc4j]]></category>

		<guid isPermaLink="false">http://jianmingli.com/wp/?p=1743</guid>
		<description><![CDATA[<p>* See this post for policy based fault handlings.</p>
Partner Link Failover
<p>* Partner link failover locations can be specified in bpel.xml</p>
&#160;
&#60;partnerLinkBinding name=&#34;RatingService&#34;&#62;
&#60;property name=&#34;wsdlLocation&#34;&#62;
    http://localhost:8080/axis/services/RatingService1?wsdl
  <a href="http://jianmingli.com/wp/?p=1743"  >&#187;&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>* See <a href="?p=1740">this post</a> for policy based fault handlings.</p>
<h3>Partner Link Failover</h3>
<p>* Partner link failover locations can be specified in bpel.xml</p>
<pre>&nbsp;
&lt;partnerLinkBinding name=&quot;RatingService&quot;&gt;
&lt;property name=&quot;wsdlLocation&quot;&gt;
    http://localhost:8080/axis/services/RatingService1?wsdl
  &lt;/property&gt;
&lt;property name=&quot;location&quot;&gt;
    http://localhost:1234/axis/services/RatingService1
    http://localhost:8080/axis/services/RatingService2
  &lt;/property&gt;
&lt;/partnerLinkBinding&gt;
&nbsp;</pre>
<h3>Partner Link Retries</h3>
<p>* Partner link retries can be specified in bpel.xml</p>
<pre>&nbsp;
&lt;partnerLinkBinding name=&quot;FlakyService&quot;&gt;
&lt;property name=&quot;wsdlLocation&quot;&gt;
    http://localhost:8080/axis/services/FlakyService?wsdl
  &lt;/property&gt;
&lt;property name=&quot;location&quot;&gt;
    http://localhost:2222/axis/services/FlakyService
  &lt;/property&gt;
&lt;property name=&quot;retryMaxCount&quot;&gt;2&lt;/property&gt;
&lt;property name=&quot;retryInterval&quot;&gt;60&lt;/property&gt;
&lt;/partnerLinkBinding&gt;
&nbsp;</pre>
<h3>Human Intervention</h3>
<h2>References</h2>
<p>* OracleAS_2\bpel\samples\demos\ResilientDemo\ResilientFlow\ResilientFlow.pdf</p>
]]></content:encoded>
			<wfw:commentRss>http://jianmingli.com/wp/?feed=rss2&amp;p=1743</wfw:commentRss>
		</item>
	</channel>
</rss>
