wORACLE Web Application Serverx


Chapter2
p.27
http://{{username}{:password}@}host{:port}uniform_resource_identifier


p.28
http://scott:tiger@www.oracle.com:80/foo/bar.html
http://scott@www.oracle.com:80/foo/bar.html
http://www.oracle.com/foo/bar.html


Command[space]Uniform_Resource_Identifier[space]HTTP/version[CRLF]
(Header_field_name:Header_field_value][CRLF])*
[CRLF]
optional_body_content


p.29
GET / HTTP/1.0
Accept: text/html, text/plain
Accept: image/gif, image/jpeg, application/pdf
Accept: */*
User-Agent: SuperWebBrowser 1.0
Referer: http://www.dynamic-info.com/main/links.html
[this line is the second carriage return/line feed pair]


Protocol/Version[space]Result_Code[space]Reason_Phrase[CRLF]
Server_software_name_and_version[CRLF]
(Header_field_name:Header_field_value[CRLF])*
[CRLF]
optional_body_content


HTTP/1.0 405 Method Not Allowed
Date: Monday, 15-Jun-98 15:13:41 GMT
Server: SuperServer/0.0.1a
MIME-version: 1.0
Content-type: text/html
Last-modified: Tuesday, 12-May-98 14:33:00 GMT
Content-length: 248


p.44
<IMG SRC="Images/DynamicLogoSmall.gif" ALT="Dynamic Logo">


p.45
<HEAD>
<TITLE>Welcome To Dynamic Information Systems</TITLE>
</HEAD>
<FRAMESET COLS="175, *">
  <NOFRAMES>    
    <a href="main.html">Non-framed home page</a>
  </NOFRAMES>
  <FRAME SRC="buttonbar.html" NAME="listFrame" FRAMEBORDER="NO" NORESIZE SCROLLING="NO">
  <FRAME SRC="main.html" NAME="contentFrame" FRAMEBORDER="NO" NORESIZE>
</FRAMESET>


p.47-48
<H2>To do</H2>
<UL>
  <LI>Become Oracle Web Server Guru
    <OL>
      <LI>Order Oracle Web Server
      <LI>Buy <I>Oracle Web Server Handbook</I>
      <LI>Read book
      <LI>Impress friends
    </OL>
  <LI>Middle-east peace
  <LI>Milk
  <LI>Eggs
</UL>


p.52
<INPUT TYPE="HIDDEN" NAME="row_key" VALUE="365231">


p.55-57
<HTML>
<BODY>
<FORM ACTION="/cgi-bin/rsvp" METHOD="POST">
<INPUT TYPE="HIDDEN" NAME="key_i" VALUE="365231">
<TABLE BORDER=1>
  <TR>
    <TD COLSPAN=2 ALIGN=CENTER><B>Update Your Profile</B></TD>
  </TR>
  <TR>
    <TD ALIGN=RIGHT><B>Name</B></TD>
    <TD><INPUT TYPE="text" NAME="name_i" SIZE=25 MAXLENGTH=40 VALUE="Scott"></TD>
  </TR>
  <TR>
    <TD ALIGN=RIGHT><B>Password</B></TD>
    <TD><INPUT TYPE="password" NAME="pass_i" SIZE=25 MAXLENGTH=40 VALUE="tiger"></TD>
  </TR>
  <TR>
    <TD VALIGN=TOP>
      <B>Favorite Color</B><BR>
      <INPUT TYPE="radio" NAME="color_i" VALUE="FF0000"><B>Red</B><BR>
      <INPUT TYPE="radio" NAME="color_i" VALUE="00FF00"><B>Green</B><BR>
      <INPUT TYPE="radio" NAME="color_i" VALUE="0000FF" CHECKED><B>Blue</B><BR>
    </TD>
    <TD VALIGN=TOP>
      <B>Database Needs</B></BR>
      <INPUT TYPE="checkbox" name="needs_i" VALUE="scale" CHECKED><B>Scalability</B><BR>
      <INPUT TYPE="checkbox" name="needs_i" VALUE="perf" CHECKED><B>Performance</B><BR>
      <INPUT TYPE="checkbox" name="needs_i" VALUE="port" CHECKED><B>Portability</B><BR>
      <INPUT TYPE="checkbox" name="needs_i" VALUE="web" CHECKED><B>Web Access</B><BR>
      <INPUT TYPE="checkbox" name="needs_i" VALUE="simple"><B>Simple</B><BR>
      <INPUT TYPE="checkbox" name="needs_i" VALUE="feat" CHECKED><B>Features</B><BR>
    </TD>
  </TR>
  <TR>
    <TD VALIGN=TOP ALIGN=CENTER>
      <B>Databases Used</B></BR>
      <SELECT NAME="used_i" SIZE=5 MULTIPLE>
      <OPTION VALUE="db2">DB/2
      <OPTION VALUE="inf">Informix
      <OPTION VALUE="ora" SELECTED>Oracle
      <OPTION VALUE="rdb" SELECTED>Rdb
      <OPTION VALUE="syb">Sybase
      </SELECT>
    </TD>
    <TD VALIGN=TOP ALIGN=CENTER>
      <B>Quote</B><BR>
      <TEXTAREA NAME="quote_i" WRAP=VIRTUAL COLS=40 ROWS=4>The quick 
      brown fox jumps over the lazy dog 80% (+/-10%) of the time.</TEXTAREA>
    </TD>
  </TR>
  <TR>
    <TD VALIGN=TOP>
      <B>Favorite RDBMS</B>
      <SELECT NAME="used_i" SIZE=1>
      <OPTION VALUE="db2">DB/2
      <OPTION VALUE="inf">Informix
      <OPTION VALUE="ora" SELECTED>Oracle
      <OPTION VALUE="rdb">Rdb
      <OPTION VALUE="syb">Sybase
      </SELECT>
    </TD>
    <TD ALIGN=CENTER>
      <INPUT TYPE="SUBMIT" VALUE="Send Data">
      <INPUT TYPE="RESET" VALUE="Revert Values">
    </TD>
  </TR>
</TABLE>
</FORM>
</BODY>
</HTML>


p.57
key_i=365231&name_i=Scott&pass_i=tiger&color_i=0000FF&
needs_i=scale&needs_i=perf&needs_i=port&needs_i=web&
needs_i=feat&used_i=ora&used_i=rdb&
quote_i=The+quick+brown+fox+jumps+over+the+lazy+dog+80%25+%28%2B%2F-
10%25%29+of+the+time.&used_i=ora


p.72
<HTML>
<SCRIPT LANGUAGE="JavaScript">
function rangeCheck(elem, lbound, ubound) {
  if (elem.value > ubound) {
    alert (elem.name + " must be less than or equal to " + ubound);
    elem.focus();
  } else {
    if (elem.value < lbound) {
      alert (elem.name + " must be greater than or equal to " + lbound);
      elem.focus();
    }
  }
}
</SCRIPT>
<BODY>
<FORM ACTION="/scott/owa/formtest2" METHOD="POST">
<B>Value</B>
<INPUT TYPE="text" NAME="val_i" VALUE="9" ONCHANGE="rangeCheck(this,7,25)">
...
</BODY>
</HTML>



Chapter3
p.91
%owsctl start -p wrbahsrv



Chapter4
p.108
PROCEDURE add_emp(ename IN VARCHAR2, sal IN NUMBER);
PROCEDURE add_emp(ename IN VARCHAR2, wage IN NUMBER);


PROCEDURE extract_root(val IN NUMBER, n IN NUMBER:=2);


p.110
<input type="hidden" name="vals_in" 
value="dummy_value_to_be_ignored">
<input type="checkbox" name="vals_in" value="tr">Trains
<input type="checkbox" name="vals_in" value="bo">Boats
<input type="checkbox" name="vals_in" value="pl">Planes


p.111
CREATE PROCEDURE multi
       (vals_in INowa_util.ident_arr:=owsh_util.empty_ident_arr)
IS
  counter  INTEGER:=1;  --JE^̏
BEGIN
  htp.olistOpen;
  --f[^𒊏o邽߂̃[vƎ̃ubNɋLq
  BEGIN
    LOOP
      --\̗vf獀ڂ𒊏o
      htp.listItem(htf.bold(vals_in(counter)));
      counter:=counter+1;
    END LOOP;
    --\̒ɗvfcĂȂȂƔO
    --gbv
  EXCEPTION
    WHEN no_data_found THEN NULL;
  END;
  htp.olistClose;
  --̏ꍇ̃[v́A\̗vf̌A
  --1傫B
  --owa_util.itevV[ẂAif..then..else^̊ȒPȃvOB
  --擪p[^TRUȄꍇ́A2p[^̒lԂB
  --łȂꍇ́A3p[^ԂB  
  htp.header(1,'vals_in contained '||
      (counter-1) || ' item'||
      owa_util.ite((counter-1)=1,'','s') || '.');
END;


PROCEDURE multi
        (vals_in IN owa_util.ident_arr:=owsh_util.empty_ident_arr)
IS
BEGIN
  htp.olistOpen;
  FOR counter IN 1..vals_in.count
  LOOP
    htp.listItem(htf.bold(vals_in(counter)));
  END LOOP;
  htp.olistClose;
  htp.header(1,'vals_in contained '|| vals_in.count || ' item'||
               owa_util.ite(vals_in.count=1,'','s') || '.');
END;


p.112
CREATE OR REPLACE PROCEDURE hello_world
IS
BEGIN
  htp.htmlOpen;
  htp.headOpen;
  htp.title('Hello World');
  htp.headClose;
  htp.p('The date is: ' || SYSDATE);
  htp.htmlClose;
END;


p.113
<html>
<head>
<title>Hello World</title>
</head>
The date is: 01-JAN-96
</html>


p.114
<select name="dept_in">
<option>ACCOUNTING
<option>OPERATIONS
<option selected>RESEARCH
<option>SALES
</select>


p.115
<select name="dept_in">
<option value="10">ACCOUNTING
<option value="40">OPERATIONS
<option selected value="20">RESEARCH
<option value="30">SALES
</select>


htp.formSelectOpen('dept_in');
htp.formSelectOption('ACCOUNTING',cattributes=>'10');
htp.formSelectOption('OPERATIONS',cattributes=>'40');
htp.formSelectOption('RESEARCH','SELECTED',cattributes=>'20');
htp.formSelectOption('SALES',cattributes=>'30');
htp.formSelectClose;


p.115-117
PROCEDURE checkout (room_in IN VARCHAR2)
IS
  v_guest  VARCHAR2(100);
  v_cost   NUMBER(7,2);
BEGIN
htp.htmlOpen;
  htp.headOpen;
  htp.title('Net Checkout');
  htp.headClose;
  htp.bodyOpen;
    SELECT guestname INTO v_guest FROM guest WHERE room=room_in;
    v_cost := hotel.calc_charges(room_in);
      htp.bold('Hello '|| vGuest || ',');
      htp.para;
      htp.p('Thank you for staying at the '||
            'Hotel Sofitel at Redwood Shores.');
      htp.p('The total cost of your stay is ' ||
             htf.bold(v_cost) || '.');
      htp.p('(See an itemization '||
             htf.anchor('itemize?room_in='||room_in, 'here');      htp.para;
      htp.p('If this is in order, you may check out '||
             'now by specifying payment information.');
      htp.formOpen('hotel.billinfo','POST');
      -ԍ\̃tB[hɊi[BĂяoꂽ
      -vV[Wɂ́Aۋ𐳂s߂ɂ̏񂪕KvB
      htp.formHidden('room_in',room_in);
      htp.tableOpen;
      -ԍ\̃tB[hɊi[BĂяoꂽ
      -vV[Wɂ́Aۋ𐳂s߂ɂ̏񂪕KvB
      htp.tableRowOpen('left','top');
      htp.tableData(htf.bold('Credit Card Type'));
      htp.tableData(htf.formRadio('cc_type_in','ae','checked') ||
                    htf.bold('American Express') ||
                    htf.br || htf.formRadio('cc_type_in','vi') ||
                    htf.bold('Visa') || htf.br || 
                    htf.formRadio('cc_type_in','mc') ||
                    htf.bold('MasterCard'));
      htp.tableRowClose;
      htp.tableRowOpen;
      htp.tableData(htf.bold('Credit Card Account'));
      htp.tableData(htf.formText('cc_acct_in','18','18'));
      htp.tableRowClose;
      htp.tableRowOpen;
      htp.tableData(htf.bold('Exp. Date (e.g. 09/98)'));
      htp.tableData(htf.formText('cc_exmon_in','2','2','09')||
                '/' || htf.formText('cc_exyr_in','2','2','98'));
      htp.tableRowClose;
      htp.tableRowOpen;
      -̃ŹAY\2sɂ܂ĕ\B
      htp.tableData( htf.formCheckbox('send_inv_in','T','checked')
                     || htf.bold ('Mail zero-balance invoice.'),
                      ccolspan=>>'2');
      htp.tableRowClose;
      htp.tableRowOpen;
      -Tu~bg{^ɖOtĂꍇ́AtH[
      -f[^ƂɁAO^l̃yATu~bgB
      -A̖ONULLݒ肳ĂƁA{^
      -^Cgݒ肳AO^l̃yA̓Tu~bgȂB
      htp.tableData(  htf.formSubmit(NULL,'Settle Account')||
                      htf.bold ('Mail zero-balance invoice.'),
                      ccolspan=>'2');
      htp.tableRowClose;
      htp.tableClose;
  htp.bodyClose;
htp.htmlClose;
END;


p.118
Set-Cookie: custno=18323; expires=Sunday, 10-Jun-97 12:00:00 GMT


Set-Cookie: custno=18323; expires=Sunday, 01-Jan-90 00:00:01 GMT


p.119
Cookie: custno=18323


Cookie: custno=18323; product=2323; product=2324


p.120
Set-Cookie: interest=intranet; expires=Sunday, 31-Dec-1999 23:59:59 GMT; domain=.dynamic-info.com


Set-Cookie: uid=gcase; expires=Sunday, 31-Dec-1999 23:59:59 GMT; domain=pim.dynamic-info.com


Cookie: interest=intranet; uid=gcase


Set-Cookie: foo=bar; domain=.foobar.com; path=/
Set-Cookie: foo=widget; domain=.foobar.com; path=/hr/owa/


Cookie: foo=bar; foo=widget


type cookie is RECORD
(
  name     varchar2(4096),
  vals     vc_arr,
  num_vals integer
);


p.122-123
CREATE OR REPLACE PROCEDURE cooktest(  name IN VARCHAR2:=NULL,
                                       val IN VARCHAR2:=NULL,
                                       exp IN VARCHAR2:=NULL,
                                       del IN VARCHAR2:='no-del')
IS
  ck_names  owa_cookie.vc_arr;
  ck_values  owa_cookie.vc_arr;
  ck_count  INTEGER;
  x  INTEGER;
BEGIN
  -- y[WMIME^Cv
  -- ƂŎw肷KvB
  owa_util.mime_header('text/html',FALSE);
  -- ǉ̑ΏۂƂȂNbL[ǂ`FbN
  IF name IS NOT NULL
  THEN
    owa_cookie.send(name,val,SYSDATE+exp);
  END IF;
  -- 폜̑ΏۂƂȂNbL[ǂ`FbN
  IF del !='no-del'
  THEN
    owa_cookie.remove(del,'bye-bye');
  END IF;
  -- wb_[̃N[YAƂŎsKvB
  owa_util.http_header_close;
  owa_cookie.get_all(ck_names,ck_values,ck_count);
  htp.htmlOpen;
    htp.headOpen;
      htp.title('Cookie Sampler (Yum!)');
    htp.headClose;
    htp.bodyOpen(NULL,'bgcolor="#FFFFFF"');
      IF ck_count != 0
      THEN
        htp.header(2,'Cookie list');
        htp.ps('Cookies sent by Browser '||
               'in ''Cookie: '' request header');
        htp.tableOpen;
        htp.tableRowOpen;
        htp.tableHeader('Name');  
        htp.tableHeader('Value');  
        htp.tableHeader('');
        htp.tableRowClose;
        FOR x IN 1..ck_count
        LOOP
          htp.tableRowOpen;
          htp.tableData(ck_names(x));  
          htp.tableData(ck_values(x));  
          htp.tableData(htf.anchor(
                        'cooktest?del='||ck_names(x),'DELETE'));
          htp.tableRowClose;
        END LOOP;      
        htp.tableClose;
      END IF;      
    
      htp.hr;
      htp.header(2,'Add a Cookie');
      htp.formOpen('cooktest');
        htp.bold('Cookie Name: ');
        htp.formText('name',40,80,name);
        htp.para;
        htp.bold('Cookie Value: ');
        htp.formText('val',40,80,val);
        htp.para;
        htp.bold('Expires in: ');
        htp.formSelectOpen('exp');
        -- valuep[^iIvVj̎gp@ɒӁB
        -- 1̈ꕔlŕ\ĂB
        htp.p('<option value="7">> 1 Week');
        htp.p('<option value="1" selected> 1 Day');
        htp.p('<option value=".04166667"> 1 Hour');
        htp.p('<option value=".010416667"> 15 Minutes');
        htp.p('<option value=".00069444"> 1 Minute');
        htp.formSelectClose;
        htp.formSubmit(NULL,'Add Cookie');
      htp.formClose;
      htp.hr;        
    htp.bodyClose;
  htp.htmlClose;
END;


p.125
<input type="image" name="var_name" src="/images/button1.jpg">


p.125-126
<html>
<head><title>Form Image Test</title></head>>
<body>
<form action="/dcd/owa/imgtest" method=GET>
<input type="image" name="point_in" SRC="/images/bigicon.gif">
</form>
</body>
</html>


p.126
PROCEDURE imgtest (point_in IN 
OWA_IMAGE.POINT:=OWA_IMAGE.NULL_POINT)
IS
BEGIN
  htp.htmlOpen;
    htp.headOpen;
      htp.title('Image Form Submit Example Result');
    htp.headClose;
    htp.bodyOpen(NULL,'bgcolor="#FFFFFF"');
      htp.header(3,'X coordinate = ' || owa_image.get_x(point_in) );
      htp.header(3,'Y coordinate = ' || owa_image.get_y(point_in) );
    htp.bodyClose;
  htp.htmlClose;
END;


p.126
http://ows.dynamic-info.com/foo/bar/map?23,67


p.128
type vc_arr is table of varchar2(32767) index by binary_integer;
  type multi_line is record
  (
    rows        vc_arr,
    num_rows    integer,
    partial_row boolean
  );
  
  
result := INSTR('webserver handbook','hand');


p.132-133
CREATE OR REPLACE PROCEDURE pat_checker (pat IN VARCHAR2:=NULL,
                    text IN VARCHAR2:=NULL,
                    show_pat IN VARCHAR2:='N')
IS
  parsed_pat  owa_pattern.pattern;
  i INTEGER;
  rev_text VARCHAR2(32767):= text;
BEGIN
  htp.htmlOpen;
    htp.headOpen;
      htp.title('Pattern Analysis');
    htp.headClose;
    htp.bodyOpen(NULL,'bgcolor="#FFFFFF"');
      IF pat IS NOT NULL
      THEN
        BEGIN
          IF show_pat='Y'
          THEN
            owa_pattern.getpat(pat,parsed_pat);
            i := 1;
            WHILE parsed_pat(i) != 'EOP'
            LOOP
              htp.print('pat('||i||') = '||parsed_pat(i)||'<br>');
              i := i+1;
            END LOOP;
            htp.para;
          END IF;
          owa_pattern.change(rev_text,pat,
                       '<b><font color="#ff0000"> & </font></b>');
          htp.p(rev_text);
        EXCEPTION
          WHEN OTHERS THEN
            htp.header(2,'An error occured. Check pattern
            format');
            htp.preOpen;
            htp.prints(dbms_utility.format_error_stack);
            htp.preClose;
        END;
      END IF;
    
      htp.hr;
        htp.formOpen('pat_checker');
          htp.bold('Pattern: ');
          htp.formText('pat',40,80,pat);
          htp.para;
          htp.bold('Text: ');
          htp.formTextAreaOpen2('text',5,50,NULL,'virtual');
          htp.p(text);
          htp.formTextAreaClose;
          htp.para;
          IF show_pat='Y'
          THEN
            htp.formCheckbox('show_pat','Y','CHECKED');
          ELSE
            htp.formCheckbox('show_pat','Y');
          END IF;
          htp.bold('Show gory details of parsed pattern.');
          htp.formSubmit(NULL,'Show code');
        htp.formClose;
      htp.hr;        
    htp.bodyClose;
  htp.htmlClose;
END;


p.134
BEGIN
date_str := '07/27/97';
owa_pattern.change(date_str, '(\d\d)/(\d\d)/(\d\d)','\2/\1/\3');
-- date_str'27/07/97'ɂȂ
END;


p.135
PROCEDURE date_parser (date_in IN VARCHAR2)
IS
components owa_text.vc_arr;
BEGIN
IF<%-2> (owa_pattern.match(date_in, '(\d\d)/(\d\d)/(\d\d)', components))
<%0>THEN
htp.print('The month is '||components(1));
htp.print('The day is '||components(2));
htp.print('The year is '||components(3));
END IF;
END;


p.137
htp.anchor(owa_util.get_cgi_env('HTTP_REFERER'),'Go whence you came.');


p.139-144
CREATE OR REPLACE PACKAGE optlock IS
  PROCEDURE main;
  PROCEDURE do_frame (empno_in IN VARCHAR2);
  PROCEDURE do_form_page_cksum (  empno_in IN VARCHAR2,
          err_msg_in IN VARCHAR2:=NULL);
  PROCEDURE do_form_page_hvals (  empno_in IN VARCHAR2,
          err_msg_in IN VARCHAR2:=NULL);
  PROCEDURE do_update_cksum (  ename_in IN VARCHAR2:=NULL,
          job_in IN VARCHAR2:=NULL,
          mgr_in IN VARCHAR2:=NULL,
          hiredate_in IN owa_util.datetype:=owa_util.empty_date,
          sal_in IN VARCHAR2:=NULL,
          comm_in IN VARCHAR2:=NULL,
          deptno_in IN VARCHAR2:=NULL,
          rowid_in IN rowid,
          checksum_in IN NUMBER);
  PROCEDURE do_update_hvals (  ename_in IN VARCHAR2:=NULL,
          job_in IN VARCHAR2:=NULL,
          mgr_in IN VARCHAR2:=NULL,
          hiredate_in IN owa_util.datetype:=owa_util.empty_date,
          sal_in IN VARCHAR2:=NULL,
          comm_in IN VARCHAR2:=NULL,
          deptno_in IN VARCHAR2:=NULL,
          old_emp IN owa_opt_lock.vcArray);
END optlock;
CREATE OR REPLACE PACKAGE BODY optlock IS
  PROCEDURE main
  IS
    CURSOR ecurs IS
      SELECT ename, empno FROM emp ORDER BY ename;
  BEGIN
    htp.htmlOpen;
    htp.headOpen;
    htp.title('OWA_OPT_LOCK Demo');
    htp.headClose;
    htp.bodyOpen;
    htp.header(2,'Please choose an employee record to edit.');
    FOR erec IN ecurs
    LOOP
      htp.anchor('optlock.do_frame?empno_in=' || erec.empno,
          erec.ename);
      htp.br;
    END LOOP;
    htp.bodyClose;
    htp.htmlClose;
  END;
  PROCEDURE do_frame (empno_in IN VARCHAR2)
  IS
  BEGIN
    htp.htmlOpen;
    htp.headOpen;
    htp.title('OWA_OPT_LOCK Demo');
    htp.headClose;
    htp.framesetOpen(ccols=>>'50%,50%');
    htp.frame('optlock.do_form_page_cksum?empno_in=' || empno_in);
    htp.frame('optlock.do_form_page_hvals?empno_in=' || empno_in);
    htp.framesetClose;
    htp.noframesOpen;
    htp<F255>.header(2,'Sorry, this demo requires a frames-capable browser.');<F102>
    htp.noframesClose;
    htp.htmlClose;
  END;
  PROCEDURE build_form (  empno_in IN VARCHAR2)
  IS
    erec  emp%rowtype;
  BEGIN
    SELECT * INTO erec FROM emp WHERE empno = empno_in;
    htp.tableOpen;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Name'));
    htp.tableData(htf.formText('ename_in',cvalue=>>erec.ename));
    htp.tableRowClose;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Job'));
    htp.tableData(htf.formText('job_in',cvalue=>>erec.job));
    htp.tableRowClose;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Manager'));
    htp.tableData(owsh_util.get_linked_menu('mgr_in','emp',
              'ename','empno',
              NULL,'ename',
              erec.mgr));
    htp.tableRowClose;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Hire date'));
    htp.p('<td>');
    owa_util.choose_date('hiredate_in',NVL(erec.hiredate,SYSDATE));
    htp.p('</td>');
    htp.tableRowClose;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Salary'));
    htp.tableData(htf.formText('sal_in',cvalue=>erec.sal));
    htp.tableRowClose;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Commission'));
    htp.tableData(htf.formText('comm_in',cvalue=>erec.comm));
    htp.tableRowClose;
    htp.tableRowOpen;
    htp.tableData(htf.bold('Department'));
    htp.tableData(owsh_util.get_linked_menu('deptno_in','dept',
              'dname','deptno',
              NULL,'dname',
              erec.deptno));
    htp.tableRowClose;
    htp.tableClose;
    htp.formSubmit(cvalue=>'Update');
  END;
  PROCEDURE do_form_page_cksum (  empno_in IN VARCHAR2,
          err_msg_in IN VARCHAR2:=NULL)
  IS
    v_rowid ROWID;
  BEGIN
    IF (err_msg_in IS NOT NULL)
    THEN
      htp.center(htf.header(2,err_msg_in));
    END IF;
    htp.bold('Note: Locking enforced by checksums.');
    SELECT rowid INTO v_rowid FROM emp WHERE empno=empno_in;
    htp.htmlOpen;
    htp.bodyOpen;
    htp.formOpen('optlock.do_update_cksum');
    build_form(empno_in);
    htp.formHidden('checksum_in',
        owa_opt_lock.checksum( USER, 'emp', v_rowid));
    htp.formHidden('rowid_in',v_rowid);
    htp.formClose;
    htp.hr;
    htp.center(htf.anchor('optlock.main','Back to list',
          cattributes=>'target="_top"'));
    htp.bodyClose;

    htp.htmlClose;
  END;
  PROCEDURE do_form_page_hvals (  empno_in IN VARCHAR2,
          err_msg_in IN VARCHAR2:=NULL)
  IS
    v_rowid ROWID;
  BEGIN
    IF (err_msg_in IS NOT NULL)
    THEN
      htp.center(htf.header(2,err_msg_in));
    END IF;
    htp.bold('Note: Locking enforced by hidden fields.');
    SELECT rowid INTO v_rowid FROM emp WHERE empno=empno_in;
    htp.htmlOpen;
    htp.bodyOpen;
    htp.formOpen('optlock.do_update_hvals');
    build_form(empno_in);
    owa_opt_lock.store_values( USER, 'emp', v_rowid);
    htp.formClose;
    htp.hr;
    htp.center(htf.anchor('optlock.main','Back to list',
          cattributes=>'target="_top"'));
    htp.bodyClose;
    htp.htmlClose;
  END;
  PROCEDURE do_update_cksum (  ename_in IN VARCHAR2:=NULL,
          job_in IN VARCHAR2:=NULL,
          mgr_in IN VARCHAR2:=NULL,
          hiredate_in IN owa_util.datetype:=owa_util.empty_date,
          sal_in IN VARCHAR2:=NULL,
          comm_in IN VARCHAR2:=NULL,
          deptno_in IN VARCHAR2:=NULL,
          rowid_in IN rowid,
          checksum_in IN NUMBER)
  IS
    err_text  VARCHAR2(200);
    v_empno  VARCHAR2(20);
    temp_date DATE;
  BEGIN
    IF (owa_opt_lock.checksum(USER,'emp',rowid_in)=checksum_in)
    THEN
      temp_date := owa_util.todate(hiredate_in);
      UPDATE emp SET ename=ename_in,job=job_in,mgr=mgr_in,
            hiredate=temp_date,
            sal=sal_in, comm=comm_in,deptno=deptno_in
        WHERE rowid=rowid_in;
      COMMIT;
      err_text:='Update successful.';
    ELSE
      err_text:='An intervening update occured.';
    END IF;
    SELECT empno INTO v_empno FROM emp WHERE rowid=rowid_in;
    do_form_page_cksum(v_empno,err_text);
  END;
  PROCEDURE do_update_hvals (  ename_in IN VARCHAR2:=NULL,
          job_in IN VARCHAR2:=NULL,
          mgr_in IN VARCHAR2:=NULL,
          hiredate_in IN owa_util.datetype:=owa_util.empty_date,
          sal_in IN VARCHAR2:=NULL,
          comm_in IN VARCHAR2:=NULL,
          deptno_in IN VARCHAR2:=NULL,
          old_emp IN owa_opt_lock.vcArray)
  IS
    v_rowid  ROWID;
    err_text  VARCHAR2(200);
    v_empno  VARCHAR2(20);
    temp_date  DATE;
  BEGIN
    v_rowid := owa_opt_lock.get_rowid(old_emp);
    IF (owa_opt_lock.verify_values(old_emp))
    THEN
      temp_date := owa_util.todate(hiredate_in);
      UPDATE emp SET ename=ename_in,job=job_in,mgr=mgr_in,
            hiredate=temp_date,
            sal=sal_in, comm=comm_in,deptno=deptno_in
        WHERE rowid=v_rowid;
      COMMIT;
      err_text:='Update successful.';
    ELSE
      err_text:='An intervening update occured.';
    END IF;
    SELECT empno INTO v_empno FROM emp WHERE rowid=v_rowid;
    do_form_page_hvals(v_empno,err_text);
  END;

END optlock;


p.146
Thu Aug 07 23:47:24 1997
OWS-05101: Agent : execution failed due to Oracle error 6564
ORA-06564: object notthere does not exist
ORA-06512: at "SYS.DBMS_DESCRIBE", line 55
ORA-06512: at line 1
  OWA SERVICE: FOOBAR
  PROCEDURE: notthere


Thu Aug 07 14:31:10 1997
OWS-05101: Agent : execution failed due to Oracle error 20001
ORA-20001: ORU-10032: procedure NOTTHERE within package SAMPLE
   does not exist
ORA-06512: at "SYS.DBMS_DESCRIBE", line 145
ORA-06512: at line 1
  OWA SERVICE: FOOBAR
  PROCEDURE: sample.notthere


p.147
Thu Aug 07 14:13:30 1997
OWS-05101: Agent : execution failed due to Oracle error 20000
ORA-20000: ORU-10035: cannot describe a package (sample); only a
   procedure within a package
ORA-06512: at "SYS.DBMS_DESCRIBE", line 75
ORA-06512: at line 1
  OWA SERVICE: FOOBAR
  PROCEDURE: sample


p.148
hu Aug 07 14:19:11 1997
OWS-05111: Agent : no stored procedure matches this call with the
   arguments passed
  OWA SERVICE: FOOBAR
  PROCEDURE: owa_util.showsource
  PARAMETERS:
  ===========
  FOO:
   bar


Thu Aug 07 14:30:51 1997
OWS-05101: Agent : execution failed due to Oracle error 6550
ORA-06550: line 1, column 77:
PLS-00306: wrong number or types of arguments in call to 'SHOWSOURCE'
ORA-06550: line 1, column 77:
PL/SQL: Statement ignored
  OWA SERVICE: FOOBAR
  PROCEDURE: owa_util.showsource


PROCEDURE FOO (date_in IN DATE);


p.149
Thu Aug 07 23:34:27 1997
OWS-05101: Agent : execution failed due to Oracle error 1858
ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 1
  OWA SERVICE: FOOBAR
  PROCEDURE: foo
  PARAMETERS:
  ===========
  DATE_IN:
   07-AUGUST-97


PROCEDURE bad_proc(id IN VARCHAR2,attr IN VARCHAR2);
PROCEDURE bad_proc(id IN VARCHAR2,attr IN OWA_UTIL.ident_arr);


p.150
SELECT text FROM user_source WHERE name='BADPROC' and line=72;


p.151-153
CREATE OR REPLACE PROCEDURE sc(  proc IN VARCHAR2:=NULL,
                err IN VARCHAR2:=NULL,
                delta IN VARCHAR2:=NULL)
IS
  procname  VARCHAR2(30);
  procowner  VARCHAR2(30);
  part1    VARCHAR2(30);
  part2    VARCHAR2(30);
  part1_type  INTEGER;
  dblink    VARCHAR2(128);
  object_id   INTEGER;
  first    INTEGER;
  last    INTEGER;
  CURSOR c1 (  n IN VARCHAR2, o IN VARCHAR2,
        first IN INTEGER,last IN INTEGER) IS
    SELECT line, text FROM all_source
      WHERE name  = UPPER(n)
        - AND owner = UPPER(o)
        AND type != 'PACKAGE BODY'
        AND line>>= first
        AND line<<=last
      ORDER BY line;
   NL_CHAR  constant  char(1) := '
';
BEGIN
  htp.htmlOpen;
    htp.headOpen;
      htp.title('Error list');
    htp.headClose;
    htp.bodyOpen(NULL,'bgcolor="#FFFFFF"');
      IF proc IS NOT NULL
      THEN
        first:=err-delta;
        last:=err+delta;
        IF (first < 1)
        THEN
          first:=1;
        END IF;
        dbms_utility.name_resolve(  proc, 1, procowner, part1,
                      part2, dblink, part1_type,
                      object_id);
    
        IF part1_type in (7,8) --P̂̃vV[W^t@NV̏ꍇ
        THEN
          procname := part2;
        ELSE
          procname := part1;
        END IF;
        htp.header(2,proc);
        htp.preOpen;
        FOR source_rec in c1 (proc, procowner,first,last)
        LOOP
          --^úAXy[X4ɒuBύXɂ́A
          --̒uiXy[XjύX邱ƁB
          IF (source_rec.line = err)
          THEN
            htp.print('<font color="#FF0000">');
            htp.prints(translate(
                       REPLACE(source_rec.text,CHR(9),'    '),
                       NL_CHAR,' '));
            htp.print('</font>');
          ELSE  
            htp.prints(translate(
                       REPLACE(source_rec.text,CHR(9),'    '),
                       NL_CHAR,' '));
          END IF;
        END LOOP;
        htp.preClose;
      END IF;      
      htp.hr;
      htp.formOpen('sc');
      htp.bold('Proc Name: ');
      htp.formText('proc',40,80,proc);
      htp.bold('Line Number: ');
      htp.formText('err',4,5,err);
      htp.para;
      htp.bold('Show '||htf.italic('N ') ||
                      'lines before and after: ');
      htp.formText('delta',3,3,'20');
      htp.formSubmit(NULL,'Show code');
      htp.formClose;
      htp.hr;        
    htp.bodyClose;
  htp.htmlClose;
END;


p.154
CREATE PROCEDURE sql_error (  emp_list_in IN OWA_UTIL.IDENT_ARR,
debug_in IN VARCHAR2 := 'F')
IS
  counter  INTEGER  :=1;
  temp_emp  VARCHAR2(10);
  emp_name  VARCHAR2(200);
  cursor_handle  INTEGER;
  qry_expr  VARCHAR2(2000);
  in_clause  VARCHAR2(1000)  :='';
  dbms_sql_feedback  INTEGER;
BEGIN
  BEGIN
    LOOP
      counter:=counter+1;
      temp_emp := emp_list_in(counter);
      in_clause := in_clause || temp_emp || ',';
    END LOOP;
  EXCEPTION
    WHEN no_data_found THEN NULL;  --܂Avf̏I
  END;
  IF (counter = 1)
  THEN
    htp.header(1,'Must specify at least one employee ID');
    RETURN;
  END IF;
  qry_expr := 'SELECT ename FROM emp WHERE empno IN ('
                                          || in_clause || ')';
  IF (debug_in = 'T')
  THEN
    htp.hr;
    htp.p(htf.bold('SQL is: ') || '<<br>>' || qry_expr);
  ELSE
    cursor_handle := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(cursor_handle, qry_expr, DBMS_SQL.NATIVE);
    DBMS_SQL.DEFINE_COLUMN(cursor_handle, 1, emp_name,200);
    dbms_sql_feedback:=DBMS_SQL.EXECUTE(cursor_handle);
  
    WHILE (DBMS_SQL.FETCH_ROWS(cursor_handle)!=0)
    LOOP
      DBMS_SQL.COLUMN_VALUE(cursor_handle, 1, emp_name);
      htp.p(emp_name);
      htp.para;
    END LOOP;
  END IF;
END;


p.155
Wed Feb 05 21:06:24 1997
OWS-05101: Agent : execution failed due to Oracle error 936
ORA-00936: missing expression
ORA-06512: at "SYS.DBMS_SYS_SQL", line 239
ORA-06512: at "SYS.DBMS_SQL", line 25
ORA-06512: at "SCOTT.SQL_ERROR", line 33
ORA-06512: at line 1
  OWA SERVICE: SCOTT
  PROCEDURE: sql_error
  PARAMETERS:
  ===========
  EMP_LIST_IN:
   place_holder
   7369
   7521
   7566


p.155
SELECT ename FROM emp WHERE empno IN (7369,7521,7566,)


in_clause:=SUBSTRING(in_clause,1,LENGTH(in_clause)-1);



Chapter5
p.159
<HTML>
<HEAD><TITLE>Testing</TITLE></HEAD>
<BODY>
<H1>WebAlchemy Saves Time</H1>
</BODY>
</HTML>


p.160
CREATE OR REPLACE PROCEDURE test1 AS 
BEGIN
  htp.htmlOpen;
  htp.headOpen;
  htp.title( 'Testing');
  htp.headClose;
  htp.bodyOpen;
  htp.header( 1, 'WebAlchemy Saves Time');
  htp.bodyClose;
  htp.htmlClose;
END;


p.162
<!--PL/SQL CURSOR e_curs IS SELECT ename FROM emp;-->
<!--PL/SQL e_rec e_curs%ROWTYPE;-->
<HTML>
<HEAD><TITLE>Employee List</TITLE></HEAD>
<BODY>
<TABLE>
<!--PL/SQL FOR e_rec IN e_curs LOOP-->
<TR>
<TD><!--PL/SQL e_rec.ename--></TD>
</TR>
<!--PL/SQL END LOOP;-->
</TABLE>
</BODY>
</HTML>


p.164
<!--PL/SQL CREATE PROCEDURE display_ename (empno_in IN NUMBER) AS -->
<!--PL/SQL v_ename VARCHAR2(50);-->
<!--PL/SQL v_mgr NUMBER;-->
<HTML>
<HEAD><TITLE>Employee Information</TITLE></HEAD>
<BODY>
<!--PL/SQL BEGIN -->
<!--PL/SQL --perform query -->
<!--PL/SQL SELECT ENAME,MGR INTO v_ename,v_mgr
FROM EMP WHERE EMPNO=empno_in; -->
<!--PL/SQL IF v_mgr IS NOT NULL-->
<!--PL/SQL THEN-->
<B>Employee Name: <!--PL/SQL ||v_ename--><B>&nbsp;
<A HREF="display_ename?empno_in='||v_mgr||'">See manager</A>
<HR>
<!--PL/SQL ELSE-->
<B>Employee Name: <!--PL/SQL ||v_ename--></B>
<HR>
<!--PL/SQL END IF;-->
<!--PL/SQL EXCEPTION-->
<!--PL/SQL WHEN OTHERS THEN-->
<H1>That employee does not exist</H1>
<HR>
<!--PL/SQL END;-->
</BODY>
</HTML>


p.165
<A HREF="display_ename?empno_in=<!--PL/SQL v_mgr -->">


p.165-166
CREATE PROCEDURE display_ename (empno_in IN NUMBER) AS 
  v_ename VARCHAR2(50);
  v_mgr NUMBER;
BEGIN
  htp.htmlOpen;
  htp.headOpen;
  htp.title( 'Employee Information');
  htp.headClose;
  htp.bodyOpen;
  BEGIN 
  --perform query 
    SELECT ENAME,MGR INTO v_ename,v_mgr
      FROM EMP
     WHERE EMPNO=empno_in; 
    IF v_mgr IS NOT NULL
    THEN
      htp.bold( 'Employee Name: '||v_ename);
      htp.print( '&nbsp; ' );
      htp.anchor2( 'display_ename?empno_in='||v_mgr||'', 'See manager');
      htp.hr;
    ELSE
      htp.bold( 'Employee Name: '||v_ename);
      htp.hr;
    END IF;
  EXCEPTION
    WHEN OTHERS THEN
      htp.header( 1, 'That employee does not exist');
      htp.hr;
  END;
  htp.bodyClose;
  htp.htmlClose;
END;


p.168-169
CREATE PROCEDURE show_emp_pic (empno_in IN NUMBER)
IS
  v_pict_raw   raw(32760);
BEGIN
  SELECT picture INTO v_pict_raw
    FROM emp
   WHERE empno=empno_in;
  IF v_pict_raw IS NULL
  THEN
    owa_util.redirect_url('/images/notfound.jpg');
  ELSE
    owa_util.mime_header('image/jpeg');
    htp.prn( utl_raw.cast_to_varchar2( v_pict_raw) );
  END IF;
END;


p.170
CREATE TABLE image (
 NAME       VARCHAR2(255),
 MIME_TYPE  VARCHAR2(30),
 IMG_SIZE   NUMBER,
 IMAGE      LONG RAW,
 constraint image_pk primary key( name ) )


p.172-176
PROCEDURE vrml_org_chart IS
  vEmp NUMBER;
  vSal NUMBER;
  vName  VARCHAR2(40);
  vJob  VARCHAR2(40);
  CURSOR minions(bossman NUMBER) IS
    SELECT  empno
      FROM  emp
     WHERE  mgr=bossman;
BEGIN
  owa_util.mime_header('x-world/x-vrml');
  SELECT EMPNO,SAL,ENAME,JOB
    INTO vEmp,vSal,vName,vJob
    FROM emp
   WHERE mgr IS NULL;
  htp.p('#VRML V1.0 ascii');
  htp.p('Separator {');
  htp.p('PerspectiveCamera { position 0 -15 5 orientation '||
        '1 0 0 .79 focalDistance 7.0 heightAngle 1.0}');
  htp.p('Material { ambientColor .2 .2 .2 ');
  htp.p('diffuseColor .8 .8 .8');
  htp.p('specularColor 0 0 0');
  htp.p('emissiveColor 0 0 0');
  htp.p('shininess 0.2');
  htp.p('transparency 0 }');
  htp.p('FontStyle { size .5');
  htp.p('family SERIF');
  htp.p('style NONE }');
  voc_DoSphere(vEmp,1,vSal,vName,vJob);
  htp.p('}');
END;

PROCEDURE voc_doSphere (  emp_in in NUMBER,
                          lvl_in in NUMBER,
                          sal_in in NUMBER,
                          name_in in VARCHAR2,
                          job_in in VARCHAR2 )
IS
  k  NUMBER;
  vEmp  NUMBER;
  vSal  NUMBER;
  vName  VARCHAR2(40);
  vJob  VARCHAR2(40);
  job_x  VARCHAR2(40);
  delta  NUMBER;
  theta  NUMBER;
  vCount  NUMBER;
  c_alpha  NUMBER;
  c_rad  NUMBER;
  c_ht  NUMBER;
  cx  NUMBER;
  cy  NUMBER;
  cz  NUMBER;
  vRadius  NUMBER;
  CURSOR minions(bossman NUMBER) IS
    SELECT  empno,sal,ename,job
      FROM  emp
     WHERE  mgr=bossman;
begin
  htp.p('WWWAnchor { name "'||owa_util.get_owa_service_path||
        'org.show_emp?empno_in=' || emp_in ||'" description "'||
        name_in||' Details "');
  --WuɉĐFI
  htp.p('Separator {');
  job_x:=RTRIM(job_in);
  IF (job_x='CLERK') THEN
    htp.p(' Material { diffuseColor .8 .8 1.0 } ');  --/O[
  ELSIF (job_x='ANALYST') THEN
    htp.p(' Material { diffuseColor .1526 0 1.0 } ');  --
  ELSIF (job_x='SALESMAN') THEN
    htp.p(' Material { diffuseColor .41132 .05237 1.0 } '); --
  ELSE  --}l[W܂͑\
    htp.p(' Material { diffuseColor 1 .018463 .16225 } ');  --
  END IF;
  vRadius:=TRUNC(.5*(sal_in/1000),5);
 htp.p('Sphere { radius '||TO_CHAR(vRadius)||' }');  --̕`
  htp.prn('Separator { Translation { translation 0 -'||
          TO_CHAR(vRadius+.5) ||
          ' 0 }  AsciiText { string "'||name_in||'"}}');
  htp.p('}}');
  SELECT COUNT (empno) INTO vCount FROM emp WHERE mgr=emp_in;
  IF (vCount != 0)
  THEN
    delta:=(2*3.141595)/vCount;
    theta:=0;
    k:=0;
    IF (vCount=1)
    THEN
      c_rad:=0;
    ELSE
      c_rad:=  6-lvl_in;
    END IF;
    c_ht:= -5;
    OPEN minions(emp_in);
    LOOP
      FETCH minions INTO vEmp,vSal,vName,vJob;
      EXIT WHEN minions%NOTFOUND;
      theta:=k*delta;
      c_alpha:=theta;
      htp.p(' Separator { ');
      voc_DoLine(c_alpha,c_rad,c_ht,lvl_in);
      htp.p(' } ');
      cx:=TRUNC(c_rad * cos(c_alpha),7);
      cy:=TRUNC(c_rad * sin(c_alpha),7);
      cz:=TRUNC(c_ht,7);
      htp.p(' Separator { ');
      htp.p(' Translation { translation '||TO_CHAR(cx)||' '||
             TO_CHAR(cy)||' '||TO_CHAR(cz)||'}');
      voc_DoSphere(vEmp,lvl_in+1,vSal,vName,vJob);
      htp.p(' } ');
      k:=k+1;
    END LOOP;
    CLOSE minions;
  END IF;
end;
PROCEDURE voc_doLine (c_alpha IN NUMBER
                      c_rad  IN NUMBER,
                      c_ht  IN NUMBER,
                      lvl_in IN NUMBER )
IS
  r_angle  NUMBER;
  c_dist  NUMBER;
  c_beta  NUMBER;
  r_trans_y  NUMBER;
BEGIN
  r_angle:=c_alpha - (3.141595/2.0);
  htp.p('Material { diffuseColor 1 1 '||
         TO_CHAR(TRUNC(1-(1/lvl_in),7) )||' }');
  htp.p('Rotation { rotation 0 0 1 '||
         TO_CHAR(TRUNC(r_angle,7))||' }');

  --ۂ̒lvZ邽߂ɎQƕ\gpB
  --ȂȂAPL/SQLɂarcsin֐Ȃ߁A
  --ߎvZsKvBA̕B
  --ȏꍇB

  --c_dist:=SQRT( (c_rad*c_rad) + (c_ht*c_ht) );
  --c_beta:=ARCSIN(c_ht/c_dist);
  IF c_rad = 0  --special case
  THEN
    c_dist:=5;
    c_beta:=-1.570796;
  ELSIF (lvl_in=1) THEN
    c_dist:= TRUNC(SQRT(25+25),7);
    c_beta:= -0.78539;
  ELSIF (lvl_in=2) THEN
    c_dist:=TRUNC(SQRT(16+25),7);
    c_beta:=-.89606;
  ELSIF (lvl_in=3) THEN
    c_dist:=TRUNC(SQRT(9+25),7);
    c_beta:=-1.03038;
  ELSIF (1=0) THEN
    c_dist:=TRUNC(SQRT(6.25+25),7);
    c_beta:=-1.10715;
  END IF;
  r_angle:=c_beta;
  htp.p('Rotation { rotation 1 0 0 '||
         TO_CHAR(TRUNC(r_angle,7))||' }');
  r_trans_y:=TRUNC(c_dist/2.0,7);
  htp.p(' Translation { translation 0 '||
          TO_CHAR(r_trans_y)|| ' 0 }');
  htp.p(' Cylinder { height -'||TO_CHAR(c_dist)||' radius .1}');
END;


p.177-180
CREATE OR REPLACE PACKAGE BODY ConText_demo IS
  PROCEDURE main
  IS
  BEGIN
    htp.htmlOpen;
    htp.headOpen;
    htp.title('Perform Search' );
    htp.headClose;
    htp.bodyOpen;
    htp.formOpen('/scott/plsql/ConText_demo.execute_query',
                 'POST');
    htp.tableOpen;
      htp.tableRowOpen;
        htp.tableData('');
        htp.tableData(htf.bold('Term'));
        htp.tableData(htf.bold('Stems'));
        htp.tableData(htf.bold('Fuzzy'));
        htp.tableData(htf.bold('Soundex'));
        htp.tableData(htf.bold('Weight'));
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.tableData('');
        htp.tableData(htf.formText('term_1'));
        htp.tableData(htf.formCheckbox('attr_1','$'),
                      calign=>'CENTER');
        htp.tableData(htf.formCheckbox('attr_1','?'),
                      calign=>'CENTER');
        htp.tableData(htf.formCheckbox('attr_1','!'),
                      calign=>'CENTER');
        htp.tableData(htf.formText('weight_1',csize=>'2',
                      cmaxlength=>'3'),calign=>'CENTER');
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.p('<TD>');
          htp.formSelectOpen('operator');
          htp.formSelectOption('and',cattributes=>
                                           'SELECTED value="&"');
          htp.formSelectOption('or',cattributes=>'value="|"');
          htp.formSelectOption('accumulate',
                               cattributes=>'value=","');
          htp.formSelectOption('minus',cattributes=>'value="-"');
          htp.formSelectOption('near',cattributes=>'value=";"');
          htp.formSelectClose;
        htp.p('</TD>');
        htp.tableData(htf.formText('term_2'));
        htp.tableData(htf.formCheckbox('attr_2','$'),
                                       calign=>'CENTER');
        htp.tableData(htf.formCheckbox('attr_2','?'),
                                       calign=>'CENTER');
        htp.tableData(htf.formCheckbox('attr_2','!'),
                                       calign=>'CENTER');
        htp.tableData(htf.formText('weight_2',csize=>'2',
                                   cmaxlength=>'3'),
                      calign=>'CENTER');
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.tableData(htf.formSubmit,ccolspan=>6,
                      calign=>'CENTER');
      htp.tableRowClose;
      htp.tableClose;
    htp.formClose;
    htp.bodyClose;
    htp.htmlClose;
  END;

  PROCEDURE execute_query(term_1 IN VARCHAR2,
                       term_2 IN VARCHAR2,
                       attr_1 IN owa_util.ident_arr:=empty_array,
                       attr_2 IN owa_util.ident_arr:=empty_array,
                       weight_1 IN VARCHAR2, weight_2 IN VARCHAR2,
                       operator IN VARCHAR2)
  IS
    t1  VARCHAR2(200);
    t2  VARCHAR2(200);
    qryterm  VARCHAR2(200);
    x  INTEGER;
  BEGIN

    htp.htmlOpen;
    htp.headOpen;
    htp.title('Search Results');
    htp.headClose;
    htp.bodyOpen;

    IF term_1 IS NOT NULL
    THEN
      t1 := '{' || term_1 || '}';
      FOR x IN 1..attr_1.COUNT
      LOOP
        t1 := attr_1(x) || t1;
      END LOOP;
      IF weight_1 IS NOT NULL
      THEN
        t1 := '(' || t1 || ')*' || weight_1;
      END IF;

      IF term_2 IS NOT NULL
      THEN
        t2 := '{' || term_2 || '}';
        FOR x IN 1..attr_1.COUNT
        LOOP
          t2 := attr_2(x) || t2;
        END LOOP;
        IF weight_2 IS NOT NULL
        THEN
          t2 := '(' || t2 || ')*' || weight_2;
        END IF;
        qryterm := '(' || t1 || ')' || operator ||
                   '(' || t2 || ')';
      ELSE
        qryterm := t1;
      END IF;

      htp.p(htf.bold('The query was: ') || qryterm );
      htp.tableOpen;
      FOR cur IN ( SELECT docid, doctitle, SCORE(0) scr
               FROM docs
              WHERE CONTAINS(doctext,qryterm,0) > 0
             ORDER BY NVL(SCORE(0),0) )
      LOOP
        htp.tableRowOpen;
        htp.tableData(htf.anchor('ConText_demo.show_doc?docid_in='
                      || cur.docid,cur.doctitle));
        htp.tableData( cur.scr );
        htp.tableRowClose;
      END LOOP;
      htp.tableClose;
    ELSE
      htp.header(1,'You must enter at least the '||
                   'first query term.');
    END IF;
    htp.bodyClose;
    htp.htmlClose;
  END;

  PROCEDURE show_doc(docid_in IN VARCHAR2)
  IS
  BEGIN
    FOR cur IN (SELECT doctitle,doctext
            FROM docs
           WHERE docid=docid_in)
    LOOP
      htp.htmlOpen;
      htp.headOpen;
      htp.title(cur.doctitle);
      htp.headClose;
      htp.bodyOpen;
      htp.p(cur.doctext);
      htp.bodyClose;
      htp.htmlClose;
    END LOOP;
  END;

END ConText_demo;


p.181
<form action="/wa/scott/owaup/emp_info.setempdata"
enctype="multipart/form-data">
<!-- ɂ́Ȃ̃tH[f[^Lq -->
<b>Your picture</b>:<input type="file" name="img_in">
<p>
<input type=submit>
</form>


p.183-186
CREATE OR REPLACE PACKAGE BODY user_pages IS

  PROCEDURE main
  IS
  BEGIN

    FOR cur IN (SELECT name,userid FROM pages ORDER BY name)
    LOOP
      htp.anchor('/scott/plsql/user_pages.show_page?uid_in='||
                 cur.userid, cur.name);
      htp.br;
    END LOOP;
    htp.anchor('/scott/plsql/user_pages.new_user_form',
               'Add a Page');

  END;
  PROCEDURE new_user_form
  IS
    x INTEGER;
  BEGIN
    htp.htmlOpen;
    htp.headOpen;
    htp.title('New page' );
    htp.headClose;
    htp.bodyOpen;
    --tH[̃ANVƂ/owaup/w肵Aenctype
    --tĂ_ɒӁB
    htp.formOpen('/wa/scott/owaup/user_pages.new_user_upload',
                 'POST',
                 cattributes=>'enctype="multipart/form-data"');
    htp.tableOpen;
      htp.tableRowOpen;
        htp.tableData(htf.bold('Name:') );
        htp.tableData(htf.formText('name_in') );
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.tableData(htf.bold('Email Address:') );
        htp.tableData(htf.formText('email_in') );
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.tableData( htf.bold('Meaningful Quotation'),
                       cattributes=>'valign=top');
        htp.tableData(htf.formTextArea('quote_in',7,40));
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.tableData(htf.bold('Your picture:'));
        htp.p('<td><input type="file" name="file_in"></td>');
      htp.tableRowClose;
      htp.tableRowOpen;
        htp.p('<td colspan=2>');
        htp.p('<font size=4><b>Favorite Web Sites</b></font>');
        htp.tableOpen;
          htp.tableRowOpen;
            htp.tableData(htf.bold('Site Name'));
            htp.tableData(htf.bold('Site URL'));
          htp.tableRowClose;
          FOR x IN 1..10
          LOOP
            htp.tableRowOpen;
              htp.tableData(htf.formText('lk_name_in'));
              htp.tableData(htf.formText('lk_url_in'));
            htp.tableRowClose;
          END LOOP;
        htp.tableClose;
        htp.p('</td>');
      htp.tableRowClose;
    htp.tableClose;
    htp.formSubmit;
    htp.formClose;
    htp.bodyClose;
    htp.htmlClose;

  END;

  PROCEDURE new_user_upload(  file_in IN VARCHAR2,
                              name_in IN VARCHAR2,
                              email_in IN VARCHAR2,
                              quote_in IN VARCHAR2,
                              lk_name_in IN OWA_UTIL.IDENT_ARR:=empty_ident_arr,
                              lk_url_in IN OWA_UTIL.IDENT_ARR:=empty_ident_arr)
  IS
    lk_count INTEGER;
    x INTEGER;
    vuid NUMBER(12);
  BEGIN
    SELECT seq_uid.nextval INTO vuid FROM dual;
    INSERT INTO pages VALUES (vuid, file_in, name_in,
                              email_in, quote_in);
    lk_count:=lk_name_in.COUNT;
    IF (lk_count > lk_url_in.COUNT)
    THEN
      lk_count:=lk_url_in.COUNT;
    END IF;

    FOR x IN 1..lk_count
    LOOP
      INSERT INTO links VALUES (vuid,lk_name_in(x),lk_url_in(x));
    END LOOP;
    COMMIT;
    show_page (vuid);
  END;

  PROCEDURE show_page (uid_in IN NUMBER)
  IS
  BEGIN
    FOR cur IN (SELECT * FROM pages WHERE userid=uid_in)
    LOOP
      htp.htmlOpen;
      htp.headOpen;
      htp.title(cur.name || '''s Page' );
      htp.headClose;
      htp.bodyOpen;
      htp.header(1,'Hi, I''m ' || cur.name );
      --owaiR[āAɉ摜𖄂ߍށB
      htp.img('/wa/scott/owai/'||cur.img_name);
      htp.para;
      htp.bold('My favorite quotation is:');
      htp.blockQuoteOpen;
      htp.p(cur.quote);
      htp.blockQuoteClose;
      htp.bold('My favorite sites are:');
      htp.tableOpen;
      FOR subcur IN (SELECT name,url
                       FROM links
                      WHERE userid=uid_in)
      LOOP
        htp.tableRowOpen;
        htp.tableData(htf.anchor(subcur.url,subcur.name));
        htp.tableRowClose;
      END LOOP;
      htp.tableClose;
      htp.bodyClose;
      htp.htmlClose;
    END LOOP;
  END;

END user_pages;<$&figure10[v]>


p.189-193
CREATE OR REPLACE PACKAGE BODY cfg_maker AS
  PROCEDURE main
  IS
  BEGIN
    list_dcds;
  END;

  PROCEDURE list_dcds
  IS
    x  INTEGER;
  BEGIN
    htp.htmlOpen;
    htp.headOpen;
    htp.title( 'Database Connection Descriptor Creation');
    htp.headClose;
    htp.bodyOpen( cattributes => ' text="#000088"' || 
                 'link="#BB0000" vlink="#BB0000"' );
    SELECT COUNT(*) INTO x FROM dcd_list;
    IF x!=0
    THEN
      FOR cur IN (SELECT dcd_name FROM dcd_list ORDER BY dcd_name)
      LOOP
        htp.bold(cur.dcd_name);
        htp.anchor('cfg_maker.delete_dcd?dcd_name_in='||
                   cur.dcd_name,'DELETE');
        htp.br;
      END LOOP;
    END IF;
    htp.anchor('cfg_maker.add_dcd',htf.bold('Create new DCD'));
    htp.para;
    htp.anchor('cfg_maker.gen_cfg',htf.bold('Generate the owa.cfg file'));
    htp.bodyClose;
    htp.htmlClose;
  END;

  PROCEDURE add_dcd
  IS
  BEGIN
    htp.htmlOpen;
    htp.headOpen;
    htp.title( 'Database Connection Descriptor Creation');
    htp.headClose;
    htp.bodyOpen( cattributes => ' text="#000088"'||
                  'link="#BB0000" vlink="#BB0000"' );
    htp.br( cclear => 'right');
    htp.header( 2, htf.fontOpen( ccolor => '#BB0000') || 
     htf.em( 'Create New DCD (Database Connection Descriptor') || 
     htf.fontClose);
    htp.print( 'From this screen, you can create a new '||
               'Database Connection Descriptor. Create a '||
               'new DCD by filling in the fields below, '||
               'selecting to create a new PL/SQL Agent '||
               'Database User, install the WebServer '||
               'Developer''s Toolkit, and then selecting the ' );
    htp.em( '"Submit New Service"');
    htp.print( 'button.  ' );
    htp.para;
    htp.formOpen( curl => 'cfg_maker.insert_dcd', 
                  cmethod => 'POST');
    htp.preOpen;
    htp.print('(*) indicates required fields.');
    htp.print('(+) indicates that one of these two '||
              'fields is required. ');
    htp.print('(-) indicates the field can be automatically '||
              'filled upon submission.'); 
    htp.preClose;
    htp.bold('(*) DCD name:' );
    htp.formText( cname => 'dcd_name_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.bold( '(*) PL/SQL Agent Database User:  ' );
    htp.formText( cname => 'owa_user_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.bold( 'Identified by: ' );
    htp.formPassword( cname => 'owa_pass_in', csize => '25',
                      cvalue => '');
    htp.br;
    htp.bold( '(*) ORACLE_HOME:                 ' );
    htp.formText( cname => 'owa_home_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.bold( '(+) ORACLE_SID:                  ' );
    htp.formText( cname => 'owa_sid_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.bold( '(+) SQL*Net V2 Service:          ' );
    htp.formText( cname => 'owa_connstr_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.bold( '(*) Authorized Ports (separate by spaces):' );
    htp.formText( cname => 'owa_valport_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.bold( 'Log File Directory: ' );
    htp.formText( cname => 'owa_logdir_in', csize => '28',
                  cvalue => '');
    htp.br;
    htp.bold( 'HTML Error Page:' );
    htp.formText( cname => 'owa_errpage_in', csize => '28',
                  cvalue => '');
    htp.br;
    htp.bold( '(-) NLS Language:' );
    htp.formText( cname => 'owa_nlslang_in', csize => '30',
                  cvalue => '');
    htp.br;
    htp.hr;
    htp.formSubmit;
    htp.formClose;
    htp.hr;
    htp.bodyClose;
    htp.htmlClose;
  END;
  PROCEDURE delete_dcd(dcd_name_in IN VARCHAR2)
  IS
  BEGIN
    DELETE FROM dcd_list WHERE dcd_name=dcd_name_in;
    COMMIT;
    list_dcds;
  END;
  PROCEDURE insert_dcd(dcd_name_in IN VARCHAR2:=NULL,
                       owa_user_in IN VARCHAR2:=NULL,
                       owa_pass_in IN VARCHAR2:=NULL,
                       owa_home_in IN VARCHAR2:=NULL,
                       owa_sid_in IN VARCHAR2:=NULL,
                       owa_connstr_in IN VARCHAR2:=NULL,
                       owa_valport_in IN VARCHAR2:=NULL,
                       owa_logdir_in IN VARCHAR2:=NULL,
                       owa_errpage_in IN VARCHAR2:=NULL,
                       owa_nlslang_in IN VARCHAR2:=NULL)
  IS
  BEGIN
    INSERT INTO dcd_list
    VALUES (dcd_name_in,owa_user_in,owa_pass_in,owa_home_in,
            owa_sid_in,owa_connstr_in,owa_valport_in,
            owa_logdir_in,owa_errpage_in,owa_nlslang_in);
    COMMIT;
    htp.header(1,'DCD '||dcd_name_in||' added.');
    list_dcds;
  END;

  PROCEDURE attrout (attr_in IN VARCHAR2, val_in IN VARCHAR2)
  IS
  BEGIN
    IF val_in IS NOT NULL
    THEN
      htp.p('(');
      htp.p(attr_in||'='||val_in);
      htp.p(')');
    END IF;
  END;

  PROCEDURE gen_cfg
  IS
    CURSOR dcd_cur IS SELECT * FROM dcd_list;
    cur dcd_cur%ROWTYPE;
  BEGIN
    owa_util.mime_header('text/plain');
    FOR cur IN dcd_cur
    LOOP
      htp.p('#');
      htp.p('');
      htp.p('(');
      htp.p('owa_service='||cur.dcd_name);
      attrout('owa_user',cur.owa_user);
      attrout('owa_password',cur.owa_pass);
      attrout('oracle_home',cur.owa_home);
      attrout('oracle_sid',cur.owa_sid);
      attrout('owa_connect_string',cur.owa_connstr);
      attrout('owa_valid_ports',cur.owa_valport);
      attrout('owa_log_dir',cur.owa_logdir);
      attrout('owa_error_page',cur.owa_errpage);
      attrout('owa_nls_lang',cur.owa_nlslang);
    END LOOP;
    htp.p(')');
    htp.p('');
    htp.p('');
  END;
END cfg_maker;
CREATE TABLE dcd_list (
  dcd_name  VARCHAR2(30),
  owa_user  VARCHAR2(30),
  owa_pass  VARCHAR2(30),
  owa_home  VARCHAR2(30),
  owa_sid   VARCHAR2(30),
  owa_connstr  VARCHAR2(30),
  owa_valport  VARCHAR2(30),
  owa_logdir  VARCHAR2(200),
  owa_errpage  VARCHAR2(200),
  owa_nlslang  VARCHAR2(30)
)



Chapter6
p.199
import oracle.html.*;

class HelloWorld{
  public static void main(String args[]) {

    // <HEAD>`</HEAD>^O𐶐邽߂ɁA
    // HtmlHeadIuWFNg쐬B
    // y[W̃^CgnB

    HtmlHead hd = new HtmlHead ( "Hello World" );

    // y[W̃C̃Reci[邽߂ɁA
    // HtmlBodyIuWFNg쐬B

    HtmlBody bd = new HtmlBody ();

    // wb_[у{fBi{j\HtmlPageIuWFNg쐬B

    HtmlPage pg = new HtmlPage ( hd, bd );

    // {fBɕuHello WorldvǉB

    bd.addItem( new SimpleItem( "Hello World" ) );

    // HTTPwb_[óB

    pg.printHeader();

    // y[WIuWFNg̓eóB

    pg.print();
  }
} 


p.200
<HTML>
<!--  Generated by Oracle.html  -->
<HEAD>
<TITLE>Hello World</TITLE>
</HEAD>
<BODY>
Hello World
</BODY>
</HTML>


// ԊȒPȃT[o[JavaR|[lg
// ^[Qbg: Oracle Web Server JavaJ[gbWo[W2.x
class HelloWorld2{
  public static void main(String args[]) {
    System.out.println("Content-type:  text/html\n");
    System.out.println("<html><head>Hello World</head>);
    System.out.println("<body>Hello World</body></html>");
  }
}


p.201
import oracle.java.*;
class HelloWorld3{
  public static void main(String args[]) {

    // vŎgpӂHtmlStream擾B
    // theStream()́AÓIȃ\bhł_ɒӁB

    HtmlStream stream = HtmlStream.theStream();
    stream.println( "Content-type:  text/html\n" );
    stream.println( "Hello World" );
  }
}


p.201-204
import oracle.html.*;
class BasicHTML{
  public static void main(String args[]) {
    HtmlHead hd = new HtmlHead ( "Basic Text Display" );
    HtmlBody bd = new HtmlBody ();
    // wb_[у{fB\HtmlPageIuWFNg쐬B
    HtmlPage pg = new HtmlPage ( hd, bd );
    // y[W̔wiёOiieLXgj̐FݒB
    // F́A܂܂ȕ@ŐݒłB
    // Ƃ΁AVColorIuWFNg쐬A
    // ̍\vfłRedAGreenABlue
    // l𐔒li0`255jŎw肷邱ƂłB
    pg.setBackgroundColor( new Color (255,255,255) );
    // F𕶎ŎwB
    pg.setForegroundColor( "#000000" );
    // oracle.html.Color̒萔gpB
    pg.setActivatedLinkColor ( Color.white );
    // ́Aoi[i[邽߂CompoundItem쐬B
    // ɂ́Ae̍\vfi[邱ƂɂȂB
    // oi[̊i[́AōsB
    CompoundItem banner = new CompoundItem();
    // y[W̃{fBɃoi[ǉB
    bd.addItem( banner );
    // SimpleItemƂNXł́Ai^Oi<p>jA
    // s^Oi<br>jA^Oi<hr>j\
    // 萔`ĂB
    bd.addItem( SimpleItem.Paragraph );
    // oracle.html.ItemƂۃNXp
    // setXXX()Ƃ\bhgAtH[}bgp
    // ȒPȃeLXgڂy[WɂǉB
    bd.addItem( new SimpleItem( "Big " ).setFontSize( 7 ) );
    bd.addItem( new SimpleItem( "Bold " ).setBold() );
    bd.addItem( new SimpleItem( "Italic " ).setItal() );
    bd.addItem( SimpleItem.Paragraph );
    bd.addItem( SimpleItem.Paragraph );
    // ̍sł́ACqAĕGȃtH[}bg
    // eLXgɐݒ肷@Ă
    // iAśÅ֌WŕsɕĂjB
    bd.addItem( new SimpleItem( "Big, bold &amp; italic" )
            .setBold().setItal().setFontSize( 7 ) );
    bd.addItem( SimpleItem.Paragraph );
    bd.addItem( new SimpleItem( "This example demonstrates:" ) );
    // A̍ڂ\ԍXg쐬B
    UnOrderedList ul = new UnOrderedList();
    // ֗̕ȃR[@ɒӁB\bhaddItem()
    // Ƃ\bhgp΁AłHtmlItem
    // ł󂯎Bw肵addItem()R[
    // ƁA̕SimpleItemɕϊAǉB
    ul.addItem(new SimpleItem( "Basic text formats" ) );
    ul.addItem( "Setting up a page" );
    ul.addItem(new SimpleItem( "Creating hypertext links" ) );
    ul.addItem( "Embedding graphics" );
    ul.addItem(new SimpleItem( "Basic lists" ) );
    bd.addItem( ul );
    bd.addItem( SimpleItem.Paragraph );
    // Oraclẽz[y[WɃANZX邽߂̃NǉB
    bd.addItem( "Go to the " );
    bd.addItem( new Link ( "http://www.oracle.com/",
                                  "Oracle home page" ) );
    // oi[i[Boi[́Ay[Wɒǉς݂łĂA
    // HTML܂ĂȂ߁A܂ύX\B
    // QƐ̃IuWFNgĂ邽߁A
    // ǂ̂悤ɂł邱ƂłB
    // ܂AVvȐ^OǉBY
    //萔ANXSimpleItemŒ񋟂ĂB
    //ImageNX́A3ʂ̕@ŃCX^XłB
    banner.addItem( SimpleItem.HorizontalRule );
    // ł́A摜AփeLXgi摜\łȂ
    // ꍇpjAzuIvVAщ摜ł邩ǂ
    // w肵ĂB
    // 2p[^"\"Dynamic Logo\""ł́Â悤
    // p𖾎IɎw肵Ȃ΂ȂȂB́A
    // NXoracle.html.ImageɃoO邩łB
    // ܂A摜IuWFNgɂ́A\bh
    // setCenter()KpĂB́AKNX
    // oracle.html.ItempB
    // 2: Web Application Server 3.0oracle.html
    // pbP[Wɂ́AƌSImageNX
    //@Bgp΁ABORDERAHSPACEAVSPACE
    // Ȃǂ̊ẽIvVׂłB
    Image img = new Image(
       "http://www.dynamic-info.com/Images/DynamicLogoSmall.gif",
                  "\"Dynamic Logo\"", IVAlign.NONE, false );
    img.setCenter();
    // 摜ɑ΂郊N̍쐬B
    Link homeLink = new Link("http://www.dynamic-info.com/",img);
    banner.addItem( homeLink );
    // ̍ڂ́AHTMLIuWFNgɒږߍޕ@
    // ĂB<HR>^OɃIvVǉ
    // OWAS 2.xoracle.htmlł͂̂߂̃NXT|[g
    // ĂȂ߁Ȁꍇ͂̕KĂB
    banner.addItem( "<hr width=\"50%\" size=\"5\">"  );
    // Â̂́Ao[W3.0ł܂삷B
    /*
    banner.addItem(new HorizontalRule("CENTER", false, 5,"50%" );
    */
    // HTTPwb_[̏óB
    pg.printHeader();
    // y[WIuWFNg̓ȅóB
    pg.print();
  }
}


p.204-205
import oracle.html.*;
public class TableSample {
  public static void main (String args[]) throws HtmlException {
    HtmlHead hd = new HtmlHead("A Square Table");
    HtmlBody bd = new HtmlBody();
    HtmlPage pg = new HtmlPage(hd, bd);
  // 2̕\̂߂DynamicTable쐬B
  DynamicTable tab = new DynamicTable(2);
  // 񌩏op̍s쐬B
  TableRow row = new TableRow();
  row.addCell(new TableHeaderCell(
                        new SimpleItem( "i" ).setItal() ) );
  CompoundItem label = new CompoundItem();
  label.addItem( new SimpleItem("i").setItal() );
  label.addItem( new SimpleItem("2").setSuper() );
  row.addCell( new TableHeaderCell( label ) );
  tab.addRow(row);
  // s100s쐬ÅesɐlƂ̕li[B
  for (int i = 1; i <= 100; i++) {
    row = new TableRow();
    row.addCell( new TableDataCell( new SimpleItem( i ) ) );
    row.addCell( new TableDataCell( new SimpleItem( i*i ) ) ); 
    tab.addRow(row);
  }
  // Y\y[WɒǉAo͂B
  pg.addItem(tab);
  pg.printHeader();
  pg.print();
  }
}


p.205-206
import oracle.html.*;
public class FormSample {
  public static void main (String args[]) throws HtmlException {
    HtmlHead hd = new HtmlHead("Get InFORMed");
    HtmlBody bd = new HtmlBody();
    HtmlPage pg = new HtmlPage(hd, bd);
  // tH[IuWFNg̍쐬iTu~bg̃ANVƃ\bhwj
  Form frm = new Form( "POST",
                     "http://host.com/java/handleForm/" );
  // O͂邽߂̃ZNV̍쐬ƒǉB
  form.addItem ( new SimpleItem ( "Name " ).setBold() );
  form.addItem (new TextField ("name", 40, 40, "Your name here" );
  form.addItem ( SimpleItem.Paragraph );
  form.addItem ( new SimpleItem ( "I love Paris " ).setBold() );
  // hbv_E܂̓|bvAbṽj[AIvVtō쐬B
  Select choices = new Select ( "lovesparis" )
  choices.addOption( new Option( "in the Springtime",
                                   "spring", true ) );
  choices.addOption( new Option( "in the Fall", "fall", false ) );
  choices.addOption(new Option("in the Winter, when it Drizzles",
                                "winter", false ) );
  choices.addOption(new Option("in the Summer, when it Sizzles",
                                "summer", false ) );
  choices.addOption( new Option( "every moment of the year",
                                  "always", false ) );
  form.addItem ( choices );
  form.addItem ( SimpleItem.Paragraph );
  form.addItem ( new SimpleItem ( 
                          "I like Java because" ).setBold() );
  form.addItem ( new SimpleItem ( "<BR>" ));
  // TextArea쐬AtH[ɒǉB
  TextArea ta = new TextArea( "javacomment",40,5 );
  ta.setDefaultContent( "The usual reasons" );
  form.addItem ( ta );
  form.addItem ( SimpleItem.Paragraph );
  // uSend AnswersvƂ^Cg̃Tu~bg{^ǉB
  form.addItem ( new Submit( null, "Send answers" ) );
  pg.addItem(form);
  pg.printHeader();
  pg.print();
  }
}


p.207
//T[o[JavaR|[lgit[gpj
// ^[Qbg: Oracle Web Server JavaJ[gbWo[W2,xA3.0
import oracle.html.*;
class FrameTest{
  public static void main(String args[]) {
    //{y[Wiwb_[ƃt[Zbgj̍쐬
    HtmlHead hd = new HtmlHead();
    Frameset theFrameset = new Frameset();
    HtmlPage pg = new HtmlPage( hd, theFrameset );
    // y[W^Cg̐ݒ
    hd.setTitle("Looking for Something?");
    // t[̍\ƕ\HTML̐ݒ
    // i[U[̃uEUŃt[\łȂꍇj
    theFrameset.setRows( "50%,50%" );
    theFrameset.setAltHtml(new SimpleItem("No Frames, too bad."));
    // et[Ń|CgURL̐ݒ
    theFrameset.addFrame( new Frame(
            "http://www.altavista.digital.com/", "alta_vista" ) );
    theFrameset.addFrame( new Frame(
                        "http://www.yahoo.com/", "yahoo" ) );
    // HTTPwb_[̏o
    pg.printHeader();
    // ̍śAo[W2.0`3.0b3ł̃oOi\bh
    // HtmlPage.print()ɂāAy[WHtmlHeadڂ
    // ֘AtĂHTMLۂɏo͂Ȃj
    // ɑ΂΍B
    pg.getHead().print();
    // y[WɊ֘AtĂHTMLo
    pg.print();
  }
}


p.208
// T[o[JavaR|[lgit[Zbg̖ߍ݂j
// ^[Qbg: Oracle Web Server JavaJ[gbWo[W2,xA3.0
import oracle.html.*;
class AdvFrames{
  public static void main(String args[]) {
    //{y[Wiwb_[ƃt[Zbgj̍쐬
    HtmlHead hd = new HtmlHead();
    // et[ɃSi[
    Frame theFrame = new Frame ( "http://www.dynamic-info.com/Images/DynamicLogoSmall.gif");
    // t[Zbgiy[W̏㔼j̍쐬Ɗi[
    Frameset upperFrameset = new Frameset( "*,*,*" , "" );
    upperFrameset.addFrame(theFrame);
    upperFrameset.addFrame(theFrame);
    upperFrameset.addFrame(theFrame);
    // t[Zbgiy[W̉j̍쐬Ɗi[
    Frameset lowerFrameset = new Frameset( "" , "*,*,*" );
    lowerFrameset.addFrame(theFrame);
    lowerFrameset.addFrame(theFrame);
    lowerFrameset.addFrame(theFrame);
    // 1̃ReiɃt[2i[
    Container frames = new Container();
    frames.addItem(upperFrameset);
    frames.addItem(lowerFrameset);
    CompoundItem bummerText = new CompoundItem().addItem(
                       new SimpleItem("No Frames, too bad."));
    // gbvx̃t[Zbgit[
    // Containerœnjݒ
    Frameset mainFrameset = new Frameset(
                          "*,*", "", bummerText, frames);
    HtmlPage pg = new HtmlPage( hd, mainFrameset );
    // y[W^Cg̐ݒ
    hd.setTitle( "I've been framed!" );
    // HTTPwb_[o
    pg.printHeader();
    // wb_[Iɏo
    pg.getHead().print();
    // y[WɊ֘AtĂHTMLo
    pg.print();
  }
}


p.209
Form frm = new Form("GET", "table");
  frm
    .addItem(new SimpleItem("Please let us know more about
@@@@@@@@@@@@@@@@@@@yourself").setBold())
    .addItem(SimpleItem.Paragraph)
    .addItem(new SimpleItem("Name: ").setBold().setItal())
    .addItem(new TextField("name", 32, 16, ""))
    .addItem(SimpleItem.LineBreak)
    .addItem(new SimpleItem("Age:  ").setCode().setEmphasis())
    .addItem(new PasswordField("age", 32, 16, ""))
    .addItem(SimpleItem.Paragraph);


p.210
HTTP rq = HTTP.getRequest();
String empName = rq.getURLParameter( "empname" );


p.211
HTTP rq = HTTP.getRequest();
Hashtable heads = rq.getHeaders( "empname" );
Enumeration enum = heads.keys();
while ( enum.hasMoreElements() ) {
  String headNm = (String) enum.nextElement();
  bd.addItem( headNm + " = =");
  bd.addItem( heads.get( headNm ) );
  bd.addItem( SimpleItem.Paragraph );
}


p.212
pl2java [options] username/password[@connect-string] packagename...<%0>


p.214
CREATE OR REPLACE PACKAGE EmpReport IS
  TYPE str_table IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
  TYPE num_table IS TABLE OF NUMBER(10) INDEX BY BINARY_INTEGER;
  TYPE date_table IS TABLE OF DATE INDEX BY BINARY_INTEGER;
  FUNCTION count_employees RETURN NUMBER;
  PROCEDURE list_employees (emp_name OUT str_table,
                            emp_no OUT num_table,
                            emp_hire OUT date_table,
                            emp_mgr OUT num_table);
  FUNCTION get_emp_name (emp_no IN NUMBER) RETURN VARCHAR2;
END EmpReport;


import oracle.rdbms.*;
import oracle.plsql.*;
public class EmpReport {
  private Session _dbSession;
  private static final String _pkgName = "EmpReport";
  public EmpReport(Session dbSession) { _dbSession = dbSession; }
  private Statement _count_employees0_stmt;
  public PDouble count_employees() throws ServerException {
    //...
  }
  private Statement _get_emp_name0_stmt;
  public int get_emp_name_0_return_length = 255;
  public PStringBuffer get_emp_name(PDouble emp_no)
                       throws ServerException {
//...
  }
  private Statement _list_employees0_stmt;
  public void list_employees(PStringBuffer[] emp_name,
        PDouble[] emp_no,
        PDate[] emp_hire,
        PDouble[] emp_mgr) throws ServerException {
    //...
  }
}


p.218
CREATE OR REPLACE PACKAGE AS EmpReport AS
  FUNCTION count_employees RETURN NUMBER
  IS
    v_result  NUMBER;
  BEGIN
    SELECT COUNT(empno) INTO v_result FROM emp;
    RETURN v_result;
  END;
 PROCEDURE list_employees (emp_name OUT str_table,
                            emp_no OUT num_table,
                            emp_hire OUT date_table,
                            emp_mgr OUT num_table)
  IS
    CURSOR foo_cur IS SELECT ename, empno, hiredate, mgr FROM emp;
    i  INTEGER :=1;
  BEGIN
    i:=1;
    FOR tcurs IN foo_cur
    LOOP
      emp_name(i):=tcurs.ename;
      emp_no(i):=tcurs.empno;
      emp_hire(i):=tcurs.hiredate;
      emp_mgr(i):=tcurs.mgr;
      i:= i+1;
    END LOOP;
  END;
  FUNCTION get_emp_name (emp_no IN NUMBER) RETURN VARCHAR2
  IS
    v_result VARCHAR2(200);
  BEGIN
    SELECT ename INTO v_result FROM emp WHERE empno=emp_no;
    RETURN (v_result);
  END;
END EmpReport;


P.219-221
import oracle.rdbms.*;
import oracle.plsql.*;
import oracle.html.*;
public class EmployeeList {
  public static void main (String args[]) throws HtmlException {
    HtmlHead hd = new HtmlHead("Employee Listing");
    HtmlBody bd = new HtmlBody();
    HtmlPage pg = new HtmlPage(hd, bd);
  // wb_[́Aŏo͂BȂȂAy[W̐ŕsӂ
  // I\邽߂łBwb_[ŐĂ΁A
  // ŕR[KvȂB
  pg.printHeader();
    Session session;
  // f[^x[XZbV̍쐬ƃOI
  try {
    session = new Session( "scott/tiger" );
  } catch (ServerException e) {
    bd.addItem(new SimpleItem("Logon fails: " + e.getSqlerrm()));
    pg.print();
    return;
  }
  // EmpReportpbP[W̐VCX^X̍쐬
  EmpReport empRept = new EmpReport(session);
  // p[^ƂĎgpPL/SQL̒lJvZ邽߂
  // IuWFNg쐬
  PDouble         pEmployeeCount;
  PStringBuffer  pEmployeeName[];
  PDouble         pEmployeeNumber[];
  PDate           pEmployeeHired[];
  PDouble         pEmployeeManager[];
    // EmpReportpbP[WR[A]ƈ̐JEg
  try { 
    pEmployeeCount = empRept.count_employees();
  } catch (ServerException e) {
    bd.addItem("Failure at emp_count: " + e.getSqlerrm());
    pg.print();
    return;
  }
  // PDouble̒lJavaintɕϊ
  int employeeCount = (int)pEmployeeCount.doubleValue();
  if (employeeCount == 0) {

@LISTING =     bd.addItem("No employees in database.");
    pg.print();
    return;
  }
  // ]ƈf[^i[邽߂̔z蓖Ă
  pEmployeeName     = new PStringBuffer[employeeCount];
  pEmployeeNumber   = new PDouble[employeeCount];
  pEmployeeHired   = new PDate[employeeCount];
  pEmployeeManager   = new PDouble[employeeCount];
  // ]ƈf[^̊i[ƂȂۂ̃IuWFNg
  // 蓖Ă
  for(int i = 0; i < employeeCount; i++) {
    // ]ƈ̍ő咷́A30
    pEmployeeName[i]   = new PStringBuffer(30);
    pEmployeeNumber[i] = new PDouble();
    pEmployeeHired[i] = new PDate();
    pEmployeeManager[i] = new PDouble();
  }
  //  list_employeesNA]ƈf[^o
  try {
    empRept.list_employees( pEmployeeName, pEmployeeNumber,
                            pEmployeeHired, pEmployeeManager );
  } catch (ServerException e) {
    bd.addItem("Failure at list_employees: " + e.getSqlerrm());
    hp.print();
    return;
  }
  // ̓\𐶐
  DynamicTable tab = new DynamicTable(4);
  TableRow row = new TableRow();
  row.addCell(new TableHeaderCell("Employee Name"));
  row.addCell(new TableHeaderCell("Hire Date"));
  row.addCell(new TableHeaderCell("Employee Number"));
  row.addCell(new TableHeaderCell("Manager"));
  tab.addRow(row);
  for (int i = 0; i < employeeCount; i++) {
    row = new TableRow();
    row.addCell( new TableDataCell(
                     pEmployeeName[i].toString() ) );
    row.addCell( new TableDataCell(
                     pEmployeeHired[i].dateValue().toString() ) );
    row.addCell( new TableDataCell(
                     pEmployeeNumber[i].toString()));
    //  }l[WiijNULLłȂ`FbN
    if (pEmployeeManager[i].isNull()) {
      row.addCell(new TableDataCell(""));
    } else {
      try {
        // get_emp_nameɂāA}l[W̖O擾
        row.addCell( new TableDataCell(
                         empRept.get_emp_name(
                         pEmployeeManager[i]).toString() ) );
      } catch (ServerException e){
        row.addCell( "Failure at get_emp_name: "+e.getSqlerrm() );
        pg.print();
        return;
      }
    }
    tab.addRow(row);
  }
  // \y[WɕtAo͂
  pg.addItem(tab);
  pg.print();
  // f[^x[X烍OIt
  try {
    session.logoff();
  } catch (ServerException e){
    // ̗OɊւāAsׂ͉Ȃ
    ;
  }
  }
}


P.222
pl2java internal/manager@orcl dbms_sql


P.223-226
import oracle.html.*;
import oracle.plsql.*;
import oracle.rdbms.*;
import java.util.*;
import java.io.*;
import java.lang.*;
// Java̒瓮ISQLɃANZX邽߂̕@B
// AJDBĆAgpȂB
public class dsqldemo {
  public static void main(String args[])
  {
    // y[W̃ZbgAbv
    HtmlHead hd = new HtmlHead("Java Dynamic SQL Example");
    HtmlBody bd = new HtmlBody();
    bd.setBackgroundColor( Color.white );
    HtmlPage hp = new HtmlPage(hd, bd);
    bd.addItem( new SimpleItem(
                     "Tables and Dynamic SQL" ).setHeading(2) );
    // ڑ̃vpeBݒ
    Session.setProperty("ORACLE_HOME",
                       System.getProperty("ORACLE_HOME");
    // ZbV쐬Aڑ݂B
    // dbsessiońAANZXł悤ɁAtry..catchubN
    // OŐ錾BtryubN̒Œ`ƁAtry
    // ubN̒炵ANZXłȂB
    Session dbsession;
    try {
      dbsession = new Session ( "scott/tiger" );
      bd.addItem(new SimpleItem( "Logon Successful" ).setBold() );
    } catch (ServerException e) {
      bd.addItem( "An error occurred at logon." );
      bd.addItem(new SimpleItem( e.getSqlerrm() ).setBold() );
      bd.addItem(new SimpleItem( e.getSqlcode() ).setBold() );
      return;
    }
    // f[^x[XZbVgāAISQLIuWFNg쐬
    dbms_sql dsql = new dbms_sql( dbsession );
    // sql_curśAJ[\ւ̃ANZXێ邽߂Ɏgp
    // QƒlłB
    PDouble  sql_curs;
    // J[\̃I[v݂
    try {
      sql_curs = dsql.open_cursor();
    } catch (ServerException e) {
      bd.addItem( "An error occurred at dbms_sql.open_cursor." );
      bd.addItem(new SimpleItem( e.getSqlerrm() ).setBold() );
      bd.addItem(new SimpleItem( e.getSqlcode() ).setBold() );
      pg.print();
      return;
    }
    // bp[DBMS_SQLpbP[WƂ肷ۂɎgp
    // IuWFNgCX^XB
    // ̏ꍇ͌Œ̃eLXggp邪A[U[w
    // ꂽp[^쐬ȂǁACӂ̃eLXggp
    // 邱ƂłB
    PStringBuffer qryStr = new PStringBuffer(
                "SELECT ename,empno FROM emp ORDER BY sal DESC");
    PStringBuffer p_ename = new PStringBuffer(30);
    PStringBuffer p_empno = new PStringBuffer(30);
    PDouble exec_type = new PDouble (0);
    //  ϐstmtgpāAvZXł݈̌ʒuǗB
    // ̂߁AG[ĂAǂDBMS_SQLŏQ
    // ̂c邱ƂłB
    String stmt = null;
    try {
      // ȍ~́APL/SQL̒瓮ISQLɃANZX
      // ꍇƓlłB
      // ܂Ả͂sB
      stmt = "dbms_sql.parse";
      dsql.parse( sql_curs, qryStr, exec_type);
      // ɁÃ}bsO`B
      // PDoubleAp[^Ƃēn悤ɁACX^X
      // KvBIntƂĊȒPɓnƂł΂悢A
      // ̂悤ȃIvV͂ȂB
      stmt = "dbms_sql.define_column";
      dsql.define_column( sql_curs,
                      new PDouble(1), p_ename, new PDouble(30) );
      dsql.define_column( sql_curs,
                      new PDouble(2), p_empno, new PDouble(30) );
      // SQLɂ₢킹sB
      stmt = "dbms_sql.execute";
      dsql.execute( sql_curs );
      // ʂi[邽߂̓I\쐬Ǎo
      // B
      DynamicTable tab = new DynamicTable(2);
      TableRow hdrRow = new TableRow(2);
      hdrRow.addCell( new TableDataCell (
                          new SimpleItem("ENAME").setBold() ) );
      hdrRow.addCell( new TableDataCell (
                          new SimpleItem("EMPNO").setBold() ) );
      tab.addRow(hdrRow);
      // 1soAes̗l𒊏oA
      // s𓮓I\ɒǉB
      // dbms_sql.fetch_rows()[ԂiR[h
      // ݂ȂƂĂjƁAwhile[v
      // IB
      stmt = "dbms_sql.fetch_rows";
      PDouble fetch_result;
      while ( dsql.fetch_rows( sql_curs ).intValue() != 0 ) {
        stmt = "dbms_sql.column_value";
        dsql.column_value( sql_curs, new PDouble(1), p_ename );
        dsql.column_value( sql_curs, new PDouble(2), p_empno );
        TableRow dataRow = new TableRow(2);
        dataRow.addCell( p_ename.toString() );
        dataRow.addCell( p_empno.toString() );
        tab.addRow(dataRow);
      }

     // \{fBɒǉB
      bd.addItem(tab);
    } catch (ServerException e) {
      bd.addItem( "An error occurred at " + stmt );
      bd.addItem(new SimpleItem( e.getSqlerrm() ).setBold() );
      bd.addItem(new SimpleItem( e.getSqlcode() ).setBold() );
      try { dsql.close_cursor( sql_curs ); }
      catch (ServerException e1) { return; };
      pg.print();
      return;
    }
    stmt = "dbms_sql.close_cursor";
    try { dsql.close_cursor( sql_curs ); }
    catch (ServerException e) { return; };
    try {
      dbsession.logoff();
      bd.addItem(new SimpleItem( "Logoff Successful" ).setBold());
    } catch (ServerException e) {
      bd.addItem(new SimpleItem( "An error occurred at logoff" ).setBold() );
      bd.addItem(new SimpleItem( e.getSqlerrm() ).setBold() );
      bd.addItem(new SimpleItem( e.getSqlcode() ).setBold() );
      pg.print();
      return;
    }
    // wb_[̏o
    pg.printHeader();
    // y[W̓eo
    pg.print();
  }
}


P.227
[Apps]
;
; APP      Object Path                       Entry Point   Min     Max
; ===      ===========                       ===========   ===     ===
JAVA       %ORAWEB_HOME%/lib/libjava.so      ojsdinit      0      100
SJAVA      %ORAWEB_HOME%/lib/libjava.so      ojsdinit      0      100

; ...

[JAVA]
CLASSPATH          = %ORAWEB_HOME%/java/harmless.zip:...
LD_LIBRARY_PATH    = %ORAWEB_HOME%/lib:%ORAWEB_HOME%/java/lib
JAVA_HOME          = %ORAWEB_HOME%/java

[SJAVA]
CLASSPATH          = %ORAWEB_HOME%/java/danger.zip:%ORAWEB_HOME%/java/harmless.zip:...
LD_LIBRARY_PATH    = %ORAWEB_HOME%/lib:%ORAWEB_HOME%/java/lib
JAVA_HOME          = %ORAWEB_HOME%/java<%0>



P.228
pg.addItem( new HTMLStockInfo( "ORCL" ) );


P.229
<!-- sample.html -->
<HTML>
<HEAD>
<TITLE>ʁXɊǗ</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<P>
<HR>
<H2>̃y[Wł́A\ƋƖp̃WbN𕪗邽߂̃eNjbNB</H2>
<HR>
<P>
<B>HtmlFile</B>ѓ<B>&ltWRB_INC&gt</B>^Ogp΁AHtmlt@CJavaIHtmlItemƂăbv邱ƂłB
<P>
Ƃ΁A̕\́Aoracle.htmlɂĐÃ^Oɂđ}ĂB
<P>
<PRE>
&ltWRB_INC NAME="table1" VALUE="LISTING_VALUE"&gt
</PRE>
<P>
<WRB_INC NAME="table1" VALUE="LISTING_TABLE">
</BODY>
</HTML>


P.229-230
// FileDemo.java
import java.util.*;
import oracle.html.*;
import java.io.File;

public class FileDemo {
  public static void main(String args[]) {
    // \1Aɔzargs[]œnꂽ
    // p[^ƒ`ĂϐAׂĊi[B
    DynamicTable tab = new DynamicTable(2);
    int argct = args.length;
    for (int i = 0; i < args.length; i++) {
      TableRow row = new TableRow();
      row.addCell(new TableDataCell(
                      "args[" + String.valueOf(i) + "]"));
      row.addCell(new TableDataCell(args[i]));
      tab.addRow(row);
    }
    Properties allProps = System.getProperties();
    int propct = allProps.size();
    // 񋓂邽߂ɁAƂeNjbNgpB
    // ŏ͏킩ɂAJavał
    // 悭głB
    for (Enumeration propEnum = allProps.keys();
                     propEnum.hasMoreElements(); )
    {
      String tempKey = propEnum.nextElement().toString();
      TableRow row = new TableRow();
      row.addCell(new TableDataCell(tempKey));
      row.addCell(new TableDataCell(
                      allProps.getProperty(tempKey)));
      tab.addRow(row);
    }
    // ΃pXAt@C̃pX擾B
    File f = new File(System.getProperty("ORACLE_HOME") + 
                  "\\ows20\\sample\\java\\sample.html");
    TableRow row = new TableRow();
    row.addCell(new TableDataCell( "This file" ));
    row.addCell(new TableDataCell( f.toString ));
    tab.addRow(row);
    // t@CRXgN^ƂēnAVHTMLy[W쐬B  
    HtmlPage pg = new HtmlPage(f);
    // tab.toHtml()ŐHTML̃RecɂāA
    // <WRB_INC NAME="table1">^OuB
    pg.setItemAt( "table1", tab );
    pg.printHeader();
    pg.print();
  }
}


P.231
// NXOutputLogStream̃CX^X
OutputLogStream log = OutputLogStream("MyComponentName");

// G[bZ[W̏o
log.println(OutputLogStream.SEVERITY_FATAL,
            "Unrecoverable error."); 



Chapter7
p.239
<!--#config errmsg="Oh no! An error occurred."-->


<!--#exec cgi="/cgi/counter?<!--#echo var="DOCUMENT_URL"-->"-->


p.240
<!--#config errmsg="An error occurred, please notify the
    <a href="mailto:mgr@oraweb.com?subject=LiveHTML+Error">
    webmaster
    </a>"
-->


p.242
<!--#config timefmt="%A, %B %d, %Y, at %I:%M %p"-->


<!--#config timefmt="%T on %d-%b-%Y"-->


p.243
<!--#include virtual="/docs/info/include/stuff.html"-->

<!--#include file="include/stuff.html"-->


p.246
<!--#exec cgi="/samp/owa/directory.list_people?dept=20"-->


<!--#config cmdecho=ON--><!-- must set to ON to return result -->
<!--#config cmdpostfix="<br>"-->
<!--#exec cmd="/bin/finger support@myisp.net"-->


p.247
<!--#request url="http://www.oraweb.com/demo/hello?foo=bar"-->


p.248
http://www.oraweb.com/live/test.shtml?name=king&title=president


<!--#request URL="http://www.oraweb.com/test/owa/emp.add?
      name=$name&title=$title"-->


p.249
http://www.oraweb.com/test/owa/emp.add?name=king&title=president


<!--#request url="http://www.oraweb.com/test/sql?qry='select *
     from foo where bar=$where'"-->


http://www.oraweb.com/live/test2.shtml?where=123


htt<%-2>p://www.oraweb.com/test/sql?qry=select+*+from+foo+where+bar%3D123<%0>


<!--#request url="http://'www.oraweb.com'/test3/sql?foo=bar"-->
<!--#r<%-2>equest url="http://www.oraweb.com/test3/sql?'my param'=bar"<%0>-->


p.251
<body bgcolor="#FFFFFF">
<image src="/corp/image/logo.jpg">
<image src="/acctg/image/logo.jpg">


<hr>
<address>
For comments about these web pages, please email the
<a href="mailto:fred@company.com">Accounting Web Master</a>
</address>
</body>


p.252
<html>
<head>
<title>Accounting a-go-go</title>
</head>
<!--#include virtual="/acctg/templates/header.shtml"-->
<H1>Welcome to the Accounting Home Page</H1>
Here in Accounting, we do all kinds of fascinating, yet somehow
underappreciated things like: paying bills, auditing accounts,
rejecting expense reports, [blah, blah, blah]
<!--#include virtual="/acctg/templates/footer.shtml"-->
</html>


<hr>
<form action="mailto:fred@company.com?subject=question" method="POST"
<table>
<tr><td colspan=2>
<b>Question for Accounting? Ask it here!</b>
<td></tr>
<td><textarea name="Q">Type your question here.</textarea></td>
<td><input type="submit" value="Submit"></td></tr>
</table>
</form>
<address>
For comments about these web pages, please email the
<a href="mailto:fred@company.com">Accounting Web Master</a>
</address>
</body>


p.253
<html>
<head><title>File Archive</title></head>
<!--#include virtual="/acctg/templates/header.shtml"-->
<h1>Welcome to the Accounting File Archive</h1>
<table>
<tr>
<td><b>Description</b></td>
<td><b>Last Changed</b></td>
<td><b>File Size</b></td></tr>
<tr>
<td><a href="/acctg/doc/info.html"><b>Department Info<b></a></td>
<td><!--flastmod virtual="/acctg/doc/info.html"--></td>
<td><!--fsize virtual="/acctg/doc/info.html"--></td>
</tr>
<!-- Additional rows of files here -->
</table>
<!--#include virtual="/acctg/templates/footer.shtml"-->
</html>



Chapter8
p.261
[ODBC Data Sources]
o7 = Oracle7
s10 = Sybase10
i7 = Informix7
m65 = Microsoft SQL Server 6.5
[o7]
Driver=/orahome/ows/3_0/cartx/wodbc/util/drivers/vsorac.so.1
Server=dev1
 [s10]
Driver=/orahome/ows/3_0/cartx/wodbc/util/drivers/vssyb.so.1
Server=SYBASE10
Database=devsyb1
[i7]
Driver=/orahome/ows/3_0/cartx/wodbc/util/drivers/vsifmx7.so.1
Server=devifmx1
[m65]
Driver=/orahome/ows/3_0/cartx/wodbc/util/drivers/vsorac.so.1
Description=Visigenic Microsoft SQL Server Driver
Database=devms1
Network=nettcplib
Address=tester,1433
[ODBC]
InstallDir=/orahome/ows/3_0/cartx/wodbc/util
Trace=0
TraceFile=/orahome/ows/3_0/cartx/wodbc/log/odbc.trc


p.263
% setenv ORAWEB_CARTX=$ORAWEB_HOME/cartx
% setenv SYBASE=$ORAWEB_CARTX/wodbc/1.0/vissyb10


% cd $SYBASE/install
% ./sybinit


p.267
.../odbc/execute?database=ORACLE7&dsn=o7book&          \
                 username=scott&password=tiger&        \
                 sql=DELETE+FROM+emp+WHERE+ename=      \
                 :emp_name&emp_name=KING


<html>
<form action="POST" method="http://www.oraweb.com/odbc/execute">
<input type="hidden" name="database" value="ORACLE7">
<input type="hidden" name="dsn" value="o7book">
<input type="hidden" name="username" value="scott">
<input type="hidden" name="password" value="tiger">
<input type="hidden" name="sql"
      value="delete from emp where sal>:max_sal">
<b>Delete employees with salaries greater than:</b>
<input type="text" name="max_sal" value="500">
<br>
<input type="submit">
</form>
</html>


p.268
.../odbc/execute?database=ORACLE7&dsn=o7book&              \
                 username=scott&password=tiger&            \
                 sql=DELETE+FROM+emp+WHERE+ename=          \
                 :emp_name&emp_name=KING


.../odbc/execute?database=ORACLE7&dsn=o7book&              \
                 username=scott&password=tiger&            \
                 sql=DELETE+FROM+emp+WHERE+ename=          \
                 :emp_name&emp_name_char=KING


p.272
.../odbc/tableprint?database=ORACLE7&dsn=o7book&             \
                    username=scott&password=tiger&           \
                    sql=SELECT+ename+FROM+emp


.../odbc/stringprint?database=ORACLE7&dsn=o7book&              \
                     username=scott&password=tiger&            \
                     sql=SELECT+dname,loc+FROM+dept&           \
                     outputstring=The+%1+department+is+        \
                     located+in+%2.<br>


p.273
<!--list.html -->
<html>
<head>
<title>]ƈXg</title>
</head>
<body>
<b>Follow the link for an employee for more information</b>
<br>
<table>
<!--#request url="http://oweb:88/odbc/stringprint?           \
             database=ORACLE7&dsn=dev3&username=scott&       \
             password=tiger&sql='SELECT ename,empno          \
             FROM emp'&format='<tr><td>                      \
             <a href="detail.html?empno=%2">%1</a.>          \
             </td></tr>'"-->
</table>
</body>
</html>


p.273-274
<!--details.html-->
<html>
<head>
<title>]ƈ̏ڍ׏</title>
</head>
<body>
<!--#request url="http://oweb:88/odbc/stringprint?               \
                 database=ORACLE7&dsn=dev3&username=scott&       \
                 password=tiger&sql='SELECT a.ename,a.sal,       \
                 b.ename FROM emp a,emp b WHERE
                 a.empno=$empno andb.empno=a.mgr'&outputstring=  \
                 '<h2>%1</h2><table><tr><td><b>Salary</b>        \
                 </td><td>%2</td></tr><tr><td><b>Manager</b>     \
                 </td><td>%3</td></tr></table>'" -->             \
</body>
</html>


<!--#request url="http://oweb:88/odbc/execute?database=ORACLE7   \
             &dsn=dev3&username=scott&password=tiger&            \
             sql='INSERT INTO emp VALUES(empno=:empno,ename=     \
             :ename,sal=:sal)'&empno='$empno_in'&                \
             ename='$ename'&sal_in='$sal_in'" -->


www.yourcompany.com/odbc/execute?            \
database=ORACLE7&dsn=oe&username=scott&      \
password=tiger&sql=delete+from+customer


p.275

<!--#request url="sql:maniac@www.company.com/odbc/execute?..."-->



Chapter9
p.281
/secrets/diary.html


/secrets/top_secret/


p.282
/secrets/top_secret/eyes_only*


p.284
Basic {
(Users)
clinton: damato
(Groups)
us: clinton
(Realms)
NATO: us
}


p.286
SQL>GRANT manager TO scott;


p.288
FUNCTION authorize RETURN BOOLEAN


p.288-290
CREATE OR REPLACE PACKAGE BODY owa_init IS
    -- define the procedure that will handle
    -- authentication requests for the DAD
    FUNCTION authorize RETURN BOOLEAN
    IS
        c_ip       owa_util.ip_address;
        c_psswd    VARCHAR2(50);
        c_uname    VARCHAR2(50);    
        t_ipa      NUMBER;    
        s_ipa      NUMBER:
        s_exp      DATE;
        s_psswd    VARCHAR2(50);
    BEGIN
        -- DADɑ΂Fؗv邽߂̃vV[W`B
        -- Aݒ肵ÓAEUchallenge_CAOɕ\B
        -- ̂߁A킩₷Oݒ肷B
        owa_sec.set_protection_realm('Private');
        c_ip := owa_sec.get_client_ip;
        -- Tulbg127.0.0.*̗vׂ͂āAI
        -- 󂯎BNXB̃AhXɃANZXꍇ́A
        -- c_ip(1)c_ip(2)`FbNB
        IF ((c_ip(1) = 127) AND (c_ip(2) = 0) AND (c_ip(3)= 0))
        THEN
            RETURN TRUE;
        ELSE
            c_uname := owa_sec.get_user_id;
            c_psswd := owa_sec.get_password;
            BEGIN
                SELECT password,ipaddress,expiry
                  INTO s_psswd, s_ipa, s_exp
                  FROM tempaccess
                 WHERE username = c_uname;
            EXCEPTION
                -- ُIi[U[Ȃꍇj
                WHEN OTHERS THEN
                    RETURN FALSE;
            END;
            -- IPAhX𐔒ltH[}bgɕϊ
            t_ipa = (c_ip(1) * 16777216)+
                    (c_ip(3) * 65536) +
                    (c_ip(3) * 256) +
                    c_ip(4);
            -- AJEgĂ邩ǂ`FbN
            IF (s_exp < SYSDATE)
            THEN
                DELETE FROM tempaccess
                 WHERE username = c_uname;
                RETURN FALSE;
            ELSE
                -- [U[OCς݂ǂ`FbNB܂
                -- OCĂȂꍇ́A݂̗vőMꂽ
                -- pX[h[U[̃pX[hɂȂB
                IF s_psswd IS NULL
                THEN
                    UPDATE tempaccess
                       SET password=c_psswd, ipaddress=s_ipa
                     WHERE username = c_uname;
                    RETURN TRUE;
                ELSE
                    -- ŌɁApX[hIPAhXvĂ邩ǂ
                    -- `FbNBvĂȂꍇ́AAJEg폜B
                    IF ((s_ipa = t_ipa) AND (s_psswd = c_psswd))
                    THEN
                        RETURN TRUE;
                    ELSE
                        DELETE FROM tempaccess
                         WHERE username = c_uname;
                        RETURN FALSE;
                    END IF;
                END IF;
            END IF;            
        END IF;
    END;
BEGIN
    -- pbP[W̏ɂāAF؃[hO[o
    -- ݒB̂߁A{pbP[WɃANZX悤ȗv
    -- DADoRœĂ邽тɁAowa_init.authorize
    -- sB
    owa_sec.set_authorization(OWA_SEC.GLOBAL);
END;



Chapter10
p.309-310
CREATE OR REPLACE PACKAGE BODY test_trans IS

  PROCEDURE beg
  IS
  BEGIN
    htp.header(1,'Transaction started');
    add_form;
  END;

  PROCEDURE com
  IS
  BEGIN
    htp.header(1,'Transaction committed');
    htp.anchor('test_trans.beg', 'Start new Transaction');
  END;

  PROCEDURE rb
  IS
  BEGIN
    htp.header(1,'Transaction rolled back');
    htp.anchor('test_trans.beg', 'Start new Transaction');

  END;

  PROCEDURE add_form (foo_in IN VARCHAR2:=NULL)
  IS
  BEGIN
    IF foo_in IS NOT NULL
    THEN
      INSERT INTO tttab VALUES (foo_in);
    END IF;
    FOR cur IN (SELECT foo FROM tttab)
    LOOP
      htp.p(cur.foo ||'<BR>');
    END LOOP;
    htp.para;
    htp.formOpen('test_trans.add_form','GET');
    htp.bold('Add an item:');
    htp.formText('foo_in',15,15);
    htp.formSubmit;
    htp.formClose;
    htp.para;
    htp.anchor('test_trans.com', 'Commit Changes');
    htp.para;
    htp.anchor('test_trans.rb', 'Rollback Changes');
  END;

END test_trans;


p.313-315
WRBReturnCode txn_init( WRBCtx, ctx )
dvoid   *WRBCtx;
dvoid  **ctx;
{
  if (tx_reg("SCOTT") != TX_OK)
    return (WRB_ABORT);
  if (tx_open() != TX_OK)
    return (WRB_ABORT);
  return (WRB_DONE);
}

WRBReturnCode txn_exec( WRBCtx, ctx )
dvoid   *WRBCtx;
dvoid   *ctx;
{
  TXINFO   *info;
  info = ( TXINFO *) malloc( sizeof( TXINFO ) );
  uri = WRBGetURI (WRBCtx);
  if (strstr(uri, "begintxn"))
  {
    if ((!tx_info(info)) && 
               (info->transaction_state == TX_INACTIVE ))
    {
      if (tx_begin() == TX_OK)
        WRB_printf(WRBCtx,
                  (text *)"Success: Started Transaction\n");
      else {
        WRB_printf(WRBCtx,
                  (text *)"Error: failed to being transaction\n");
        free(info);
        return WRB_ABORT;
      }
    } else
      WRB_printf(WRBCtx,
                (text *)"Error: other transaction in progress\n");
  }
  else if (strstr(uri, "com"))
    {
    if ((!tx_info(info)) &&
               (info->transaction_state == TX_ACTIVE ))
    {
      if (tx_commit() != TX_OK)
      {
        WRB_printf(WRBCtx, (text *)"Error: commit failed\n");
        return WRB_ABORT;
      }
    } else
      WRB_printf(WRBCtx,(text *)"Error: no transaction active\n");
  }
  else if (strstr(uri, "rb"))
  {
    if ((!tx_info(info)) &&
               (info->transaction_state == TX_ACTIVE ))
    {
      if (tx_rollback() != TX_OK) {
        WRB_printf(WRBCtx, (text *)"Error: rollback failed\n");
        return WRB_ABORT;
      }
    } else
      WRB_printf(WRBCtx,(text *)"Error: no transaction active\n");
    }
  else if (strstr (uri, "quit"))  //IvṼR[
  {
    WRB_printf(WRBCtx,
              (text *)"Success: Cartridge instance exiting.\n");
    tx_close();
    return WRB_ABORT;
  }
  else if (strstr (uri, "dosomething"))
  {
    if ((!tx_info(info)) &&
        (info->transaction_state == TX_INACTIVE ))
    {
      WRB_printf(WRBCtx,(text *)"Not in transactional context\n");
    }
    else
    {
      // ۂ̃AvP[Vł́AOCI܂Pro*CR[āA
      // f[^x[X𑀍삷B
    }
  }
  //{J[gbWɓnꂽ̑URLׂ͂āAŕߊlB
  else if ((!tx_info(info)) &&
           (info->transaction_state == TX_ACTIVE ))
      WRB_printf(WRBCtx, (text *)"Inside Transaction Now\n");
  else
      WRB_printf(WRBCtx, (text *)"Outside Transaction Now\n");
  tx_annotate_path((text *) "/txndemo/");  
  free(info);
  return (WRB_DONE);
}



p.317
PROCEDURE test_icx
IS
BEGIN
  htp.htmlOpen;
  htp.bodyOpen;
  -- y[ẄꕔAŐ
  htp.bold('Our stock performance:');
  htp.br;
  -- 擾邽߂ɊÕT[rXɃANZX
  resp := utl_http.request('http://owas1.dynamic-info.com/scott'||
          '/plsql/stock.get_quote_insert?symbol_in=ORCL');
  -- o̓Xg[ɉPɖߍ
  htp.p(resp);
  -- y[W̎c̕AŐ
  htp.bodyClose;
  htp.htmlClose;
END;


p.318-319
  FUNCTION xurl_to_pblock (v_xurl_string_in IN VARCHAR2)
           RETURN pblock
  IS
    v_xurl      VARCHAR2(2000);
    v_value_pairs_tab  parsed_strings_tabtype;
    v_value_pairs_tab_count  NUMBER;
    v_params_tab    parsed_strings_tabtype;
    v_params_tab_count  NUMBER;
    v_pairs_hold_tab  parsed_strings_tabtype;
    v_names_arr    name_arr;
    v_values_arr    value_arr;
    v_pblock_out    pblock;
  BEGIN
    /* '+'󔒂ɒu */
    v_xurl := TRANSLATE(v_xurl_string_in, '+', ' ');    
    /* '&'ɊÂē͕͂Al̃yAɕϊ */
    v_value_pairs_tab := param_util.STRING_TOKENIZER(v_xurl, '&');
    v_value_pairs_tab_count := v_value_pairs_tab.COUNT;
    /* l̃yAA1̒zɊi[ */
    FOR counter1 IN 0..(v_value_pairs_tab_count -1) LOOP
      v_pairs_hold_tab := param_util.STRING_TOKENIZER(
                              v_value_pairs_tab(counter1), '=');
      v_params_tab(counter1*2) := v_pairs_hold_tab(0);
      v_params_tab(counter1*2 + 1) := v_pairs_hold_tab(1);
    END LOOP;
    v_params_tab_count := v_params_tab.COUNT;    
    /* l̃yAi[Ăz͂ƂAevf
        JeS̔zɊi[ */
    FOR counter2 IN 0..(v_value_pairs_tab_count -1) LOOP
      v_names_arr(counter2) := v_params_tab(2*counter2);
      v_values_arr(counter2) := v_params_tab(2*counter2 + 1);
    END LOOP;  
    --'%xx'Ƃ16i\AASCIIɒu
    FOR counter3 IN 0..(v_value_pairs_tab_count -1) LOOP
      v_names_arr(counter3) := HEXSTRINGTOASCII(
                                          v_names_arr(counter3));
      v_values_arr(counter3) := HEXSTRINGTOASCII(
                                         v_values_arr(counter3));
    END LOOP;    
    /* lpblockɑ */  
    v_pblock_out.num_pairs := v_value_pairs_tab_count;
    v_pblock_out.v_names := v_names_arr;
    v_pblock_out.v_values := v_values_arr;
    RETURN v_pblock_out;
  EXCEPTION
    WHEN OTHERS THEN
      htp.p(SQLCODE || '    ' || SQLERRM);
    END;


p.320-321
void embed_quote (void) {
  HANDLE   retval; 
  ub4      rval; 
  ub4      ckSz = 0; 
  ub4      len; 
  char    *response; 
 
    /* NGXg̍쐬B
     WRB_ICXSetMethodR[ȂAftHg
     GET\bhgpB̂߁Ap[^URL
     ̂ɖߍށB
    */

    /* : URL͔spɃbvB*/ 
    if (!(request = WRB_ICXcreateRequest(WRBCtx,
      (text *) "http://owas1.dynamic-info.com/scott
      /plsql/stock.get_quote_insert?symbol_in=ORCL")))
    { 
      return WRB_ERROR; 
    } 
    /* NGXgsAʂuEUɒڕԂB́A
       AHTMLy[Wɖߍނ߂̓ȃtH[}bg
       ɂȂĂ邽߂łB
    */
    retval = WRB_ICXmakeRequest(WRBCtx, request, (void **)&response,
                                &len, ckSz ,TRUE); 
    /* G[̏́Aۂɂ͂قƂǕsvB́A
       uEUɒړn̏B
    */
    if (rval == WRB_FAIL) { return WRB_ERROR; } 
    else                  { return WRB_DONE;  } 
}


p.321-323
import java.io.*
import java.net.*
import java.util.*

public class FakeICX {

  Hashtable values = null;

  public String FakeICX (String theURL)
    throws MalformedURLException, IOException
  {
    URL url = new URL (theURL);
    String theStr = url.getContent();
    populateHashtable(theStr);
  }

  private final void populateHashtable(String expr)
  {
    if (expr == null) return null;

    int idx = -1,
      cnt = 1;
    //̖̒O^l̃yǍJEg
    while ((idx = expr.indexOf('&', idx+1)) != -1)  cnt ++;
    values = new Hashtable(cnt);
    for (idx=0, cnt=0; cnt<pairs.length; cnt++) {
      int eq  = expr.indexOf('=', idx);
      int end = expr.indexOf('&', idx);

      if (end == -1)  end = query.length();
      //-- L݂ĂȂǂ`FbN
      if (eq == -1  ||  eq >= end) {
        value1 = FakeICX.URLDecode(expr.substring(idx,end));
        value2 = "";
      } else {
        value1 = FakeICX.URLDecode(expr.substring(idx,eq));
        value2 = FakeICX.URLDecode(expr.substring(eq+1,end));
      }
      if(values.get(value1) == null) {
        v_temp.addElement(value2);
        values.put(value1, v_temp);
      } else {
        v_temp = (Vector) values.get(value1);
        v_temp.addElement(value2);
      }
      idx = end + 1;
    }
  }

  public final static String URLDecode(String str)
  {
    if (str == null)  return  null;
    char[] res  = new char[str.length()];
    int    didx = 0;
    //sidx: ͕p̍Adidx: o͕p̍
    for (int sidx=0; sidx<str.length(); sidx++)  {
      char ch = str.charAt(sidx);
      if (ch == '+')
        res[didx++] = ' ';
      else if (ch == '%') {
        try {
          res[didx++] =
            (char) Integer.parseInt(str.substring(
                                              sidx+1,sidx+3), 16);
          sidx += 2;
        } catch (NumberFormatException e) {
          //G[R[hXLbv
          sidx += 2;
        }
      } else {
        res[didx++] = ch;
      }
    return String.valueOf(res, 0, didx);;
  }

  public String getAsString(String key) {
    Vector v_temp = null;
    String s_return;
    try {
      v_temp = (Vector) values.get(key);
      s_return = (String) v_temp.elementAt(0);
    } catch (Exception e) {
      s_return = "##";
    }
    return s_return;
  }

  public Vector getAsVector(String key) {
    Vector v_return = null;
    String s_return;
    try {
      v_return = (Vector) values.get(key);
    } catch (Exception e) {
      v_return = null;
      v_return = new Vector();
      v_return.addElement( "##" );
    }
    return v_return;
  }
}



p.325-326
CREATE OR REPLACE PACKAGE stock IS
  PROCEDURE get_quote (symbol_in IN VARCHAR2,
                       date_in IN DATE:=NULL);
  PROCEDURE get_quote_logic (symbol_in IN VARCHAR2, 
                date_in IN DATE:=NULL, status_out OUT VARCHAR2,
                high_out OUT NUMBER, low_out OUT NUMBER,
                close_out OUT NUMBER, volume_out OUT NUMBER);
  PROCEDURE get_quote_icx (symbol_in IN VARCHAR2,
                           date_in IN DATE:=NULL);
END;

CREATE OR REPLACE PACKAGE BODY stock IS

  PROCEDURE get_quote (symbol_in IN VARCHAR2,
                       date_in IN DATE:=NULL)
  IS
  --ϐ̏
  BEGIN
    get_quote_logic (symbol_in, date_in, status, high,
                     low, close, volume);
    IF (status == 'OK')
    THEN
    --ʂĥ悢HTMLtH[}bgŊi[
    ELSE
      htp.header(1,status);
    END IF;
  END;

PROCEDURE get_quote_logic (symbol_in IN VARCHAR2, 
                date_in IN DATE:=NULL, status_out OUT VARCHAR2,
                high_out OUT NUMBER, low_out OUT NUMBER,
                close_out OUT NUMBER, volume_out OUT NUMBER)
  IS
  BEGIN
    status_out:='OK';
    SELECT high, low, close, volume
      INTO high_out, low_out, close_out, volume_out
      FROM stock_tab
     WHERE symbol = symbol_in
       AND date_stamp = date_in;
  EXCEPTION
    WHEN OTHERS THEN
      status_out := 'ERROR: Unknown error.';
  END;

  PROCEDURE get_quote_icx (symbol_in IN VARCHAR2,
                           date_in IN DATE:=NULL)
  IS
  --ϐ̏
  BEGIN
    --JavaR|[lgȒPɃANZXł悤
    --eLXg̃^Cvv[ɐݒ
    owa_util.mime_header ('text/plain',TRUE);
    get_quote_logic (symbol_in, date_in, status, high,
                     low, close, volume);
    IF (status == 'OK')
    THEN
      -- ʂv[eLXgɃGR[hĕԑ
      htp.p(  'status=' || owsh_util.url_encode(status) ||
          '&high=' || owsh_util.url_encode(high) ||
          '&low=' || owsh_util.url_encode(low) ||
          '&close=' || owsh_util.url_encode(close) ||
          '&volume=' || owsh_util.url_encode(volume) );
    ELSE
      htp.p(  'status=' || owsh_util.url_encode(status) );
    END IF;
  END;

END;


p.331
WRBReturnCode
Log_Exec(dvoid *WRBCtx, dvoid *appCtx)
{
    WAPIReturnCode   retval;
    ub4    msgLog,attrLog;
  
    retval = WRB_LOGopen(WRBCtx,&msgLog,WRBLogSysMsg,
                        WRBLogDestDefault,null);
    retval = WRB_LOGopen(WRBCtx,&attrLog,WRBLogClientDefAttrib,
                                          WRBLogDestDefault,null);

    retval = WRB_LOGwriteMessage(WRBCtx,msgLog,(text *)"LOGD",
                         (text *) "LOG-00000: Nothing to report");
    retval = WRB_LOGwriteMessage(WRBCtx,attrLog,(text *)"LOGD",
                             (text *) "pi", (text *) "3.14159" );

    retval = WRB_LOGclose(WRBCtx,msgLog);
    retval = WRB_LOGclose(WRBCtx,attrLog);
    return (WRB_DONE);
}


class LogDemo{
  public static void main(String args[]) {
  // ftHg̏ꏊւ̃MOiR|[lǵuLogDemovj
  OutputLogStream log = new OutputLogStream("LogDemo");
  try {
    // LpȃfobOށB
    // bZ[W̑Oɋ󔒂11tĂ_ɒӁB
    for(int i=0; i<=10; i++) {
      log.println(15, "           Loop iteration");
    }
  } catch (Exception e) {
    log.println(1,"LOG-00001: Unexpected error occurred. "+e.getMessage());
  }
}


p.333
WRBReturnCode
Session_Init(dvoid *WRBCtx, dvoid **appCtx)
{
  mySessionData *ctx;
  ctx = (mySessionData *)malloc(sizeof(mySessionData));
  *appCtx = ctx;
  return (WRB_DONE);
}

WRBReturnCode
Session_Exec(dvoid *WRBCtx, dvoid *appCtx)
{
  mySessionData *ctx = (mySessionData *)appCtx;
  // ReLXgf[^ɑ΂鏈
  // iǂݍ݂⏑݁jB
  return (WRB_DONE);
}

WRBReturnCode
Session_Shutdown(dvoid *WRBCtx, dvoid *appCtx)
{
  mySessionData *ctx = (mySessionData *)appCtx;
  // J[gbWł́AReLXgp̓Ǝ̍\邱ƁB
  // ReLXgp̍\Ɋi[Ăʂ̃\
  // ΂|C^́AIɉȂ΂ȂȂB
  free(ctx);
  return (WRB_DONE);
}


p.334
public class StateDemo
{
  // ÓIvpeBɊi[ĂĺA
  // ̋NɓnĈێB

  private static String last_words = "Brand New Instance";

  public static void main (String args[])
  {
    HTTP request = HTTP.getRequest();
    HtmlStream out = HtmlStream.theStream();
    out.println("Content-type: text/html\n");
    out.println("<html><head><title>State</title></head><body>");
    out.println("<H1>Previous comment: " + last_words + "</H1>");
    out.println("<form action=\"StateDemo\" method=GET>");
    out.println("<B>Enter some text</B>");
    out.println("<input type=text name=comment>");
    out.println("<input type=submit></form></body></html>");
    last_words = request.getURLParameter("comment");
    if (last_words == null) {
      last_words = "<<null>>";
    }
  }
}



Chapter11
p.343
#define SETTEXT_VERB  "settext"
#define MESSAGE_PARAM "message"
#define GETTEXT_VERB  "gettext"
#define FORMAT_PARAM  "format"


p.344
#define MESSAGE_LEN     256
typedef struct myappctx {
    char currentMessage[MESSAGE_LEN];
} myappctx;


WRBReturnCode getset_Entry(WRBCallbacks *WRBCalls)
{
    WRBCalls->init_WRBCallback = getset_Init;
    WRBCalls->authorize_WRBCallback = getset_Authorize;
    WRBCalls->exec_WRBCallback = getset_Exec;
    WRBCalls->shut_WRBCallback = getset_Shutdown;
    return (WRB_DONE);
}


p.345
static WRBReturnCode getset_Init(void *WRBCtx, void **appCtx)
{
    myappctx *ctx = (myappctx *)malloc(sizeof(myappctx));
    strcpy(ctx->currentMessage, "Default Message.");
    *appCtx = ctx;
    return (WRB_DONE);
}


static WRBReturnCode getset_Shutdown(void *WRBCtx, void *appCtx)
{
    myappctx *ctx = (myappctx *)appCtx;
    free(ctx);
    return (WRB_DONE);
}


p.345-346
static WRBReturnCode
getset_Authorize(void *WRBCtx, void *appCtx, boolean *bAuthorized)
{
    myappctx *ctx = (myappctx *)appCtx;
    char *userID, *password;

    userID   = WRBGetUserID(WRBCtx);
    password = WRBGetPassword(WRBCtx);

    if (((userID != (char*)NULL) && !strcmp(userID, "guest") &&
       (password != (char*)NULL) && !strcmp(password, "welcome")))
     *bAuthorized = TRUE;
        return (WRB_DONE);
    else
    {
     *bAuthorized = FALSE;
       WRB_setAuthBasic(WRBCtx, (text *) "Hello World");
       return (WRB_DONE);
    }
}


p.346-347
>static WRBReturnCode getset_Exec(void *WRBCtx, void *appCtx)
{
    myappctx *ctx = (myappctx *)appCtx;

  /* ṽ[t擾 */
    text   *uri = WRB_getRequestInfo(WRBCtx, WRBR_URI);

    if (!strncmp((char*)uri, SETTEXT_VERB,
                               strlen(SETTEXT_VERB)))
  {
        return (setText(ctx, WRBCtx));
    }
    else if (!strncmp((char*)uri, GETTEXT_VERB,
                                    strlen(GETTEXT_VERB)))
  {
        return(getText(ctx, WRBCtx));
    }

    /*URLs--o[W2.0APIt@NVHTTPG[Ԃ */
  /* HTTPG[400́AusvvƂӖ                      */
    WRBReturnHTTPError(WRBCtx, (WRBErrorCode)400, NULL, TRUE);
    return(WRB_DONE);
}


p.347
static WRBReturnCode setText(myappctx *ctx, void *WRBCtx)
{
    WRBpBlock hPBlock;
    char wbuf[1024];
    char *msg;

    /* tH[f[^̎擾 */
    WRB_getParsedContent(WRBCtx, &hPBlock);

    msg = WRB_findPBElemVal(WRBCtx, hPBlock,
                                     (text *)MESSAGE_PARAM, -1);
    strcpy(ctx->currentMessage, msg);

    /* ̐ */
    sprintf(wbuf, "Your message [%s] was saved.", msg); 
    writeReply(WRBCtx, wbuf);

    /* p[^ubN̉ */
    WRB_destroyPBlock(WRBCtx, hPBlock);

    return (WRB_DONE);
}


p.348
static WRBReturnCode getText(myappctx *ctx, void *WRBCtx)
{
    WRBpBlock hPBlock;
    char wbuf[1024];
    char *fmt;

    /* tH[f[^̎擾 */
    WRB_getParsedContent(WRBCtx, &hPBlock);

    fmt = WRB_findPBElemVal(WRBCtx, hPBlock,
                                     (text *)FORMAT_PARAM, -1);
    /* ̐ */
    sprintf(wbuf, "<%s>%s</%s>", fmt, ctx->currentMessage, fmt);
    writeReply(WRBCtx, wbuf);

    /* p[^ubN̉*/
    WRB_destroyPBlock(WRBCtx, hPBlock);
    return (WRB_DONE);
}


static void writeReply (void *WRBCtx, char *message)
{
    /* y[W̍쐬 */
    WRB_printf(WRBCtx, (text *)"Content-type: text/html\n\n");
    WRB_printf(WRBCtx,
             (text *)"<HEAD><TITLE>GETSET Test</TITLE></HEAD>\n");
    WRB_printf(WRBCtx, (text *)"<BODY BGCOLOR=\"#FFFFFF\">\n");
    WRB_printf(WRBCtx, (text *) message);
    WRB_printf(WRBCtx, (text *)"</BODY>\n");
}


p.351
<HTML>
<HEAD><TITLE>GETSET Cartridge Test Page</TITLE></HEAD>
<BODY>
<FORM METHOD="GET" ACTION="http://hostname:port/getset/settext">
<INPUT TYPE="text" NAME="message">
<INPUT TYPE="submit" value="Set Text">
</FORM>
<HR>
<FORM METHOD="GET" ACTION="http://hostname:port/getset/gettext">
<SELECT NAME="format">
<OPTION SELECTED VALUE="B">Bold
<OPTION VALUE="I">Italic
<OPTION VALUE="U">Underline
<OPTION VALUE="H1">Header 1
<OPTION VALUE="H2">Header 2
</SELECT>
<INPUT TYPE="submit" value="Get Text">
</FORM>
</BODY>
</HTML>


p.353
[cartridge GETSET]
OBJPATH = %ORACLE_HOME%\ows\cartx\getset\bin\getset.dll
ENTRYPOINT = getset_Entry
MIN = 0
MAX = 100
VERSION = 1.0.0.0.1
OWS_VERSION = 3.0.0.0.0
ADMIN_DESC = $CARTRIDGE$ Cartridge
ADMIN_ICON = /getset-stuff/getset.gif

[appsmap /getset]
PPATH = %ORACLE_HOME%\ows\cartx\getset\bin

[cartparams]
default_msg = No message yet

[dirmap /getset-stuff]
PPATH = %ORACLE_HOME%\ows\cartx\getset\stuff
TYPE = NR



Chapter12
p.366-367
import jdbc.sql.*;
import java.io.*;
import java.util.*;

public class jdbctest
{
    static final String drvrNm =
                            "oracle.jdbc.dnlddriver.OracleDriver";

    // ڑ̍쐬
    static final String driver = "jdbc:oracle:dnldthin";
    static final String username = "scott";
    static final String password = "tiger";
    static final String hostname = "prince.dynamic-info.com";
    static final String port = "1526";
    static final String sid = "purple";
    static final String cnctStr = driver + ":" + username + "/" +
                                password + "@" + hostname + ":" +
                                port + ":" + sid;

    static final String query = "SELECT empno,ename,sal " +
                                "  FROM emp " +
                              "ORDER BY empno";

    static Connection conn;    // f[^x[Xɑ΂ڑ

    public static final void main(String args[]) {
        try {
            //  forNameC^tF[XgpAJDBChCo
            //  [hB̕@gp΁AvpeBXg
            //  ̕܂̓p[^ƂĊYhCo
            //  włB
            Class.forName (drvrNm);

            //  f[^x[Xɑ΂ڑ̊m
            conn = DriverManager.getConnection (cnctStr);

            //  IuWFNg̍쐬
            Statement stmt = conn.createStatement ();

            //  ₢킹sAʂUgZbgɊi[
            ResultSet rset = stmt.executeQuery (query);

            //  񋓂Ɏ[vɂ
            //  UgZbgA
            //  ̒go͂B
            while (rset.next ()){
                System.out.println ( rset.getString (1) + "  " +
                                     rset.getString (2) + "  " +
                                     rset.getString (3) );
            }

            System.out.println("Done");

        } catch (Exception e) {
            //  fobȌo
            System.out.println(e.toString());
            e.printStackTrace(System.out);
        }
    }
}


p.368-369
import oracle.jsql.*;
import java.sql.*;

SQL.cursor (EmpCursor (Double EMPNO, String ENAME, Double SAL));

class jsqltest
{
  public static void main (String args[]) 
    throws SQLException 
  {
    try { 
        Class.forName("oracle.jdbc.OracleDriver");  
    } catch (ClassNotFoundException e) {
        System.out.println("Could not load the driver");
    }
    
    JSQLContext ctx =
               new JSQLContext ("jdbc:oracle:", "scott", "tiger");
    EmpCursor c =
               SQL.exec ((EmpCursor) select empno, ename, sal
                                       from emp);
    
    while (c.next()) {
      System.out.println( c.EMPNO() +"  "+c.ENAME()+" "+ c.SAL());
    }  
  }
}


p.369-370
import oracle.jsql.*;
import java.sql.*;

class adddept
{
  public static void main (String args[]) 
    throws SQLException 
  {
    try { 
        Class.forName("oracle.jdbc.OracleDriver");  
    } catch (ClassNotFoundException e) {
        System.out.println("Could not load the driver");
    }
    
    JSQLContext ctx =
               new JSQLContext ("jdbc:oracle:", "scott", "tiger");

    int p_deptno = Integer.parseInt(args[0]);
    String p_dname = args[1];
    String p_loc = args[2]

    SQL.exec (insert into dept values(:p_deptno,:p_dname,:p_loc));
    
  }
}



AppendixA
p.380
<ADDRESS CLEAR="cclear" NOWRAP cattributes>cvalue</ADDRESS>


p.381
<A HREF="curl" NAME="cname" TARGET="ctarget" cattributes>ctext</A>


htp.p('<A NAME="section1">Section 1: The PL/SQL SDK</A>');


p.382
<APPLET CODE=ccode HEIGHT=cheight WIDTH=cwidth>


</APPLET>


p.383
<AREA COORDS="ccoords" SHAPE="cshape" HREF="chref"
NOHREF TARGET="ctarget" catributes>


<HEAD>
<BASE HREF="http://www.oraweb.com/a/b/" target="_blank">
</HEAD>
<A HREF="c/foo.html">


<BASE HREF="<current URL>" TARGET="ctarget" cattributes>


p.384
<BASEFONT SIZE="nsize"


<BGSOUND SRC="csrc" LOOP="cloop" attributes>


<BIG cattributes>ctext</BIG>


p.385
<BLOCKQUOTE CLEAR="cclear" NOWRAP cattributes>


</BLOCKQUOTE>


<BODY background="cbackground" cattributes>


p.386
</BODY>


<B cattributes>ctext</B>


<BR CLEAR="cclear" cattributes>


p.387
<CENTER>ctext</CENTER>


<CENTER>


</CENTER>


p.388
<CITE cattributes>ctext</CITE>


<CODE cattributes>ctext</CODE>


p.389
<!--ctext -->


<DFN>ctext</DFN>


<DIR>


</DIR>


p.390
<DIV ALIGN="calign" cattributes>


<DL CLEAR="cclear" cattributes>


p.391
</DL>


<DD CLEAR="cclear" cattributes>ctext</DD>


<DT CLEAR="cclear" cattributes>ctext</DT>


p.392
<EM cattributes>ctext</EM>


<EM cattributes>ctext</EM>


p.393
<FONT COLOR="ccolor" FACE="cface" SIZE="csize" cattributes>


</FONT>


p.394
<INPUT TYPE="checkbox" NAME="cname" VALUE="cvalue" CHECKED cattributes>


<FORM ACTION="curl" METHOD="cmethod" TARGET="ctarget"
ENCTYPE="cenctype" cattributes>


p.395
</FORM>


<INPUT TYPE="hidden" NAME="cname" VALUE="cvalue" cattributes>


p.396
<INPUT TYPE="image" NAME="cname" SRC=csrc" ALIGN="calign"
cattributes>


<INPUT TYPE="password" NAME="cname" SIZE="csize"
MAXLENGTH="cmaxlength" VALUE="cvalue">


p.397
<INPUT TYPE="radio" NAME="cname" VALUE="cvalue" CHECKED cattributes>


<INPUT TYPE="reset" VALUE="cvalue" cattributes>


p.398
<OPTION SELECTED cattributes>cvalue


<OPTION SELECTED cattributes>cvalue


p.399
<INPUT TYPE="submit" NAME="cname" VALUE="cvalue" cattributes>


<INPUT TYPE="text" NAME="cname" SIZE="csize" MAXLENGTH="cmaxlength"
VALUE="cvalue" cattributes>


p.400
<TEXTAREA NAME="cname" ROWS="nrows" COLS="ncolumns" ALIGN="calign" cattributes></TEXTAREA>

@H3 = htp.formTextarea2 (cname, nrows, ncolumns, calign, cwrap, cattributes)


p.401
<TEXTAREA NAME="cname" ROWS="nrows" COLS="ncolumns" ALIGN="calign" WRAP="cwrap" cattributes></TEXTAREA

@H3 = htp.formTextareaOpen (cname, nrows, ncolumns, 
calign, cattributes)


<TEXTAREA NAME="cname" ROWS="nrows" COLS="ncolumns" ALIGN="calign" cattributes>


p.402
<TEXTAREA NAME="cname" ROWS="nrows" COLS="ncolumns" ALIGN="calign" WRAP="cwrap" cattributes>


</TEXTAREA>


p.403
<FRAME SRC="csrc" NAME="cname" MARGINWIDTH="cmarginwidth" MARGINHEIGHT="cmarginheight">


<FRAMESET ROWS="nrows" COLS="ccols">


</FRAMESET>


p.404
<HEAD>


</HEAD>


<Hnsize ALIGN="calign" NOWRAP CLEAR="cclear" cattributes>cheader</Hnsize>


p.405
HR CLEAR="cclear" SRC="csrc" cattributes>


<HTML>


</HTML>


p.406
<IMG SRC="curl" ALIGN="calign" ALT="calt" ISMAP USEMAP="cusemap" cattributes>



p.407
<IMG SRC="curl" ALIGN="calign" ALT="calt" ISMAP cattributes>


<ISINDEX PROMPT="cprompt" HREF="curl">


<I cattributes>ctext</I>


p.408
<KBD cattributes>ctext</KBD>


<KBD cattributes>ctext</KBD>


p.409
HR CLEAR="cclear" SRC="csrc" cattributes>


<LINK REL="crel" HREF="curl" TITLE="ctitle">


p.410
<LINK REV="crev" HREF="curl" TITLE="ctitle">


<LH cattributes>ctext</LH>


<LISTING>


p.411
</LISTING>


<LI CLEAR="ccl;ear" DINGBAT="cdingbat" SRC="csrc" cattributes>ctext


p.412
<A HREF="mailto:caddress" cattributes>ctext</A>


<MAP NAME="cname" cattributes>


</MAP>


p.413
<MENU>


</MENU>


<META HTTP-EQUIV="chttp_equiv" NAME ="cname" CONTENT="ccontent">


p.414
<BR CLEAR="cclear" cattributes>


<NOBR>ctext</NOBR>


<NOFRAMES>


</NOFRAMES>


p.415
<OL CLEAR="cclear" WRAP="cwrap" cattributes>


</OL>


<P>


p.416
<P ALIGN="calign" NOWRAP CLEAR="cclear" cattributes>


<PARAM NAME="cname" VALUE="cvalue">


p.417
<PLAINTEXT cattributes>ctext</PLAINTEXT>


<PRE CLEAR="cclear" WIDTH="cwidth" cattributes>


</PRE>


p.419
<S cattributes>ctext</S>


p.420
<SAMP cattributes>ctext</SAMP>


<SCRIPT LANGUGE=clanguage>cscript</SCRIPT>


p.421
<SMALL cattributes>ctext</SMALL>


<STRIKE cattributes>ctext</STRIKE>


<STRONG cattributes>ctext</STRONG>


p.422
<STYLE>cstyle</STYLE>


<SUB ALIGN="calign" cattributes>ctext</SUB>


p.423
<SUP ALIGN="calign" cattributes>ctext</SUP>


<CAPTION ALIGN="calign" cattributes>ccaption</CAPTION>


p.424
<TD ALIGN="calign" DP="cdp" ROWSPAN="crowspan" COLSPAN="ccolspan" NOWRAP cattributes>


<TH ALIGN="calign" DP="cdp" ROWSPAN="crowspan" COLSPAN="ccolspan" NOWRAP cattributes>


p.425
<TABLE "cborder" NOWRAP ALIGN="calign" CLEAR="cclear" cattributes>


</TABLE>


<TR ALIGN="calign" VALIGN="cvalign" DP="cdp" NOWRAP cattributes>


p.426
</TR>


<TT cattributes>ctext</TT>


p.427
<TITLE>ctitle</TITLE>


<UL CLEAR="cclear" WRAP="cwrap" DINGBAT="cdingbat" SRC="csrc" cattributes>


</UL>


p.428
<U cattributes>ctext</U>


<VAR cattributes>ctext</VAR>


<WBR>


p.430
Set-Cookie:  <name>=<value> expires=01-JAN-1990


p.431
Set-Cookie: <name>=<value> expires=<expires> path=<path> domain=<domain> secure


p.446
CREATE OR REPLACE PROCEDURE caltest
IS
  qry  VARCHAR2(4096);
BEGIN
  qry := 'SELECT HIREDATE, ENAME,NULL FROM EMP';
  owa_util.calendarprint(qry);
END;


p.448
<tr><td>QueryResultItem</td><td>QueryResultItem</td></tr>
<tr><td>QueryResultItem</td><td>QueryResultItem</td></tr>


p.451
<SELECT NAME="p_cname" SIZE="p_nsize">
<OPTION SELECTED value="value_from_column1">value_from_column2
<OPTION SELECTED value="value_from_column1"> value_from_column2
[...repeats as necessary]
</SELECT>


p.452
Content-type: <ccontent_type>\n\n


cgi_env_var_name = value\n


p.453
Location: <curl>\n\n


SQL> set serveroutput on
SQL> spool gretzky.html
SQL> execute hockey.pass('Gretzky')
SQL> execute owa_util.showpage
[ page output displayed here]
SQL> exit


p.454
<B>
This page was produced by the PL/SQL Agent on May 1, 1998 09:30
</B>


<B>
This page was produced by the PL/SQL Agent on May 1, 1998 09:30
</B>
<A HREF="showsource">View PL/SQL Source</A>


p.455
Status: <nstatus> <creason>\n\n


p.456
Status: <nstatus> <creason>\n\n



AppendixB
Ȃ



AppendixC
p.500
typedef struct _WRBPBElem
{
  text *szParamName;
  sb4 nParamName;
  text *szParamValue;
  sb4 nParamValue;
  ub2 nParamType;
  dvoid *pNVdata;
} WRBpBlockElem;


p.501
typedef sb4 WRBErrorCode;


p.502
typedef enum _WRBReturnCode
{
  WRB_DONE,
  WRB_ERROR,
  WRB_ABORT
} WRBReturnCode;


p.503
typedef enum _WAPIReturnCode 
{
   WRB_SUCCESS = 0,
  WRB_FAIL = -1, 
  WRB_NOTLOADED = -2, 
  WRB_LOWMEM = -3, 
  WRB_TOOLATE = -100, 
  WRB_AUTHNEEDED = -101, 
  WRB_MOREDATA = -102, 
  WRB_OUTSIDE = -200, 
  WRB_PROTOCOL_ERROR = -201, 
  WRB_MIXED = -202, 
  WRB_HAZARD = -203, 
  WRB_COMMITTED = -204, 
  WRB_ROLLBACK = -205 
} WAPIReturnCode;


p.504
typedef struct _WRBEntry {
  char *name;
  char *value;
} WRBEntry;


p.530-531
typedef enum _WRBInfoType
{
  STATUSCODE,
  HTTPVERSION,
  REASONPHRASE,
  REALM
} WRBInfoType;


p.531
typedef enum _WRBMethod
{
  OPTIONS,
  GET,
  HEAD,
  POST,
  PUT,
  DELETE,
  TRACE
} WRBMethod;


p.539
struct tx_info_t 
{
  XID                    xid;
  COMMIT_RETURN          when_return;
  TRANSACTION_CONTROL    transaction_control;
  TRANSACTION_TIMEOUT    transaction_timeout;
  TRANSACTION_STATE      transaction_state;
}TXINFO;


p.545
typedef enum _WRBLogDestType
{
  WRBLogDestDefault = 0,
  WRBLogDestDb = 1,
  WRBLogDestFs = 2
} WRBLogDestType;


typedef enum _WRBLogSeverity
{
  WRBLogSevFatal = 0,
  WRBLogSevErr = 1,
  WRBLogSevWarn = 4,
  WRBLogSevTraItr = 7,
  WRBLogSevAe = 8,
  WRBLogSevDebug = 11
} WRBLogSeverity;


p.546
typedef enum _WRBLogType
{
  WRBLogSysMsg = 1,
  WRBLogClientDefAttrib = 2
} WRBLogType;




