検索

建立存储过程的语法:

  一、Informix

  create procedure proc_name( [....in_parameter_list])

  returning out_para_list / out_result_set;

  二、Oracle

  create [or replace] procedure procedue_name

  [ (arg1 [ {in | out | in out }] type

  (argn [ {in | out | in out }] type,)]

  {is | as} --代替DECLARE关键字

  [ 变量定义区]

  begin

  end procedure_name;

  三、几个简单的例子

  1、没有参数也没有返回值

  1)Informix

  create procedure pNoParam()

  begin

  on exception

  rollback work;

  return;

  end exception

  begin work;

  delete from t1;

  delete from t2;

  commit work;

  end;

  end procedure;

  2)Oracle

  create or replace procedure pNoParam

  as

  begin

  delete from t1;

  delete from t2;

  commit;

  exception

  when others then

  begin

  rollback;

  end;

  end pNoParam;

  2、有输入输出

  往t1表中插入一条记录,返回值表示插入是否成功。

  1)Informix

  create procedure pNormalParam(f1 integer, f2 varchar(10))

  returning integer;

  begin

  on exception

  rollback work;

  return -1;

  end exception

  begin work;

  insert into t1 values(f1, f2);

  commit work;

  return 0;

  2)Oracle

  create or replace procedure pNormalParam(f1 number,

  f2 varchar2, v_Result out number)

  as

  begin

  insert into t1 values(f1,f2);

  commit;

  v_Result = 0;

  return;

  exception

  when others then

  begin

  rollback;

  v_Result := -1;

  end;

  end pNormalParam;

  需要注意的是,在oracle存储过程中,参数是不能加上size的,比如f1,在t1表中该字段是number(10,0),而这里只能写number,而不能写number(10,0)。

  

  

  3、返回记录集

  1)Informix

  create procedure pReturnSet() returning integer, varchar(10);

  define i integer;

  define j varchar(10);

  foreach

  select f1, f2 into i, j from t1

  return i, j with resume;

  end foreach;

  end procedure;

  2)Oracle

  create or replace package TestRefCursorPkg as type TestRefCursorTyp is ref cursor; procedure pReturnSet(RefCursor out TestRefCursorTyp); end TestRefCursorPkg;

  create or replace package body TestRefCursorPkg as

  procedure pReturnSet (RefCursor out TestRefCursorTyp)

  as

  localCursor TestRefCursorTyp;

  begin

  open localCursor for select f1, f2 from t1;

  RefCursor := localCursor;

  end pReturnSet;

  end TestRefCursorPkg;

  /

  四、其他差异说明

  1、错误捕捉

  1)Informix使用

 

  on exception

  end exception

  2)Oracle

  使用

  exception

  when others then

  2、对游标的处理

  1)Informix

  create procedure pHasCursor()

  define v_f1 integer;

  begin

  on exception

  rollback work;

  return;

  end exception

  begin work;

  foreach curt1 with hold for

  select f1 into v_f1 from t1 -- 注意这里没有分号

  if (v_f1 = 1) then

  update t1 set f2 = 'one' where current of curt1;

  elif (v_f1 = 2) then

  update t1 set f2 = 'two' where current of curt1;

  else

  update t1 set f2 = 'others' where current of curt1;

  end if;

  end foreach;

  commit work;

  end;

  end procedure;

  2)Oracle

  create or replace procedure pHasCursor

  as

  v_f1 number(10,0);

  cursor curt1 is

  select f1 from t1 for update;

  begin

  open curt1;

  loop

  fetch curt1 into v_f1;

  exit when curt1%notfound;

  if (v_f1 = 1) then

  update t1 set f2 = 'one' where current of curt1;

  elsif (v_f1 = 2) then

  update t1 set f2 = 'two' where current of curt1;

  else

  update t1 set f2 = 'others' where current of curt1;

  end if;

  end loop;

  commit;

  return;

  exception

  when others then

  begin

  rollback;

  end;

  end pHasCursor;

  3、在存储过程中调用另外一个存储过程

  1)Informix

  Call pNoParam();

  Call pNormalParam(1, ‘a’) returning v_Result;

  2)Oracle

  pNoParam;

  pNormalParam(1, ‘a’, v_Result);

  4、日期操作

  1)当前时间

  ① Informix

  define cur_dtime_var datetime year to second;

  当前日期时间: let cur_dtime_var = current; -- datetime

  ② Oracle

  Currtime date;

  Currtime := sysdate;

  2)当前日期的增减

  ① Informix

  let tmp_date = today + 3 UNITS day; -- 当前时间加三天

  let tmp_datetime = current + 1 UNITS second; -- 当前时间加1秒种

  ② Oracle

  Tmp_date := sysdate + 3; -- 当前时间加三天

  Tmp_date := sysdate + 1/24/3600; --当前时间加1秒种

  3)日期转换成字符串

  ① Informix

  let v_PeriodEndTime = year(v_date)||extend(v_date,month to month)

  ||extend(v_date,day to day) ||extend(v_date,hour to hour)

  ||extend(v_date,minute to minute)|| extend(v_date,second to second);

  ② Oracle

  v_PeriodEndTime := to_char(v_date, 'yyyymmddhh24miss');

   4)字符串转换成日期

  假设字符串的形式是yyyymmddhhmiss形式的

  ① Informix

  -- 直接转换成日期

  let v_BeginDate = substr(v_BeginTime,1,4)||'-'||substr(v_BeginTime,5,2)

  ||'-'||substr(v_BeginTime,7,2)||' '||substr(v_BeginTime,9,2)

  ||':'||substr(v_BeginTime,11,2)||':'||substr(v_BeginTime,13,2);

  -- 这个月的第一天

  let v_date = substr(v_BeginTime,1,4)||'-'

  ||substr(v_BeginTime,5,2)||'-1 00:00:00';

  -- 这个星期的第一天

  let v_date = substr(v_BeginTime,1,4)||'-'||substr(v_BeginTime,5,2)

  ||'-'||substr(v_BeginTime,7,2)||' 00:00:00';

  let v_week = weekday(v_date);

  let v_date = v_date - v_week UNITS day;

  ② Oracle

  -- 直接转换成日期

  v_BeginDate := to_date(v_BeginTime, 'yyyymmddhh24miss');

  -- 这个月的第一天

  v_BeginDate := trunc(to_date(v_BeginTime, 'yyyymmddhh24miss'), ‘mm’);

  -- 这个星期的第一天

  v_BeginDate := trunc(to_date(v_BeginTime, 'yyyymmddhh24miss'), ‘day’);

  5)事务

  在oracle中缺省情况下,一个事务的结束就是下一个事务的开始,所以对于一个事务来说,我们只要写commit;即可,不需要明确标出什么时候开始一个事务,而informix需要。

  6)打印调试信息

  7)Informix

  --设置跟踪模式

  set debug file to "trace_check"; -- with append;

  --说明“with append”表示以追加模式打开跟踪结果文件

  trace '开始执行存储过程'

  trace 'v_date='||v_date;

  trace ‘存储过程执行完毕’

  trace off;

  执行完以后打开当前目录下的trace_check即可看到打印出来的信息。

  8)Oracle

  DBMS_OUTPUT.PUT_LINE(‘开始执行存储过程’);

  DBMS_OUTPUT.PUT_LINE('v_date='||v_date);

  DBMS_OUTPUT.PUT_LINE(‘存储过程执行完毕’);

  先设置一下缓冲区的大小

  set serveroutput on size 100000; -- 如果不执行该语句,会看不到调试信息

  执行完毕以后,打印出来的信息就会直接显示在界面上。

  5、关于参数的说明

  如果存储过程想返回一个参数,在informix中是通过返回值的形式实现的,而在oracle是通过输出参数或者输入输出参数实现的。

  举例:

  1)Informix:

  create procedure p1() returning integer;

  return 0;

  end procedure;

  2)oracle:

  create or replace procedure p1(x out number)

  as

  begin

  x := 0;

  end p1;

  6、赋值

  1)informix

  let v_1 = 100;

  2)oracle

  v_1 := 100;

  7、if语句

  1)informix

  if (v_1 =100) then

  elif (v_1=200) then

  Else

  end if;

  2)oracle

  if (v_1 =100) then

  elsif (v_1=200) then

  Else

  end if;

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQL:BLOBおよびその他のNO-SQLストレージ、違いは何ですか?MySQL:BLOBおよびその他のNO-SQLストレージ、違いは何ですか?May 13, 2025 am 12:14 AM

mysql'sblobissuitable forstoringbinarydatawithinarationaldatabase、whileenosqloptionslikemongodb、redis、andcassandraofferferulesions forunstructureddata.blobissimplerbutcanslowdowdowd withwithdata

MySQLユーザーの追加:構文、オプション、セキュリティのベストプラクティスMySQLユーザーの追加:構文、オプション、セキュリティのベストプラクティスMay 13, 2025 am 12:12 AM

toaddauserinmysql、使用:createuser'username '@' host'identifidedby'password '; here'showtodoitsely:1)chosehostcarefilytoconを選択しますTrolaccess.2)setResourcelimitslikemax_queries_per_hour.3)usestrong、uniquasswords.4)endforcessl/tlsconnectionswith

MySQL:文字列データ型の一般的な間違いを回避する方法MySQL:文字列データ型の一般的な間違いを回避する方法May 13, 2025 am 12:09 AM

toavoidcommonMonmistakeswithStringDatatypesinmysql、undultingStringTypenuste、choosetherightType、andManageEncodingandCollat​​ionsEttingtingive.1)U​​secharforfixed-LengthStrings、Varcharforaible Length、AndText/Blobforlardata.2)setCurrectCherts

MySQL:文字列データ型と列挙?MySQL:文字列データ型と列挙?May 13, 2025 am 12:05 AM

mysqloffersechar、varchar、Text、anddenumforstringdata.usecharforfixed-lengthstrings、varcharerforvariable-length、text forlarger text、andenumforenforcingdataantegritywithaetofvalues。

MySQL BLOB:BLOBSリクエストを最適化する方法MySQL BLOB:BLOBSリクエストを最適化する方法May 13, 2025 am 12:03 AM

MySQLBlob要求の最適化は、次の戦略を通じて実行できます。1。ブロブクエリの頻度を減らす、独立した要求の使用、または読み込みの遅延。 2。適切なブロブタイプ(TinyBlobなど)を選択します。 3。ブロブデータを別々のテーブルに分離します。 4.アプリケーションレイヤーでBLOBデータを圧縮します。 5.ブロブメタデータをインデックスします。これらの方法は、実際のアプリケーションでの監視、キャッシュ、データシェルディングを組み合わせることにより、パフォーマンスを効果的に改善できます。

MySQLにユーザーを追加:完全なチュートリアルMySQLにユーザーを追加:完全なチュートリアルMay 12, 2025 am 12:14 AM

MySQLユーザーを追加する方法を習得することは、データベース管理者と開発者にとって重要です。これは、データベースのセキュリティとアクセス制御を保証するためです。 1)CreateUserコマンドを使用して新しいユーザーを作成し、2)付与コマンドを介してアクセス許可を割り当て、3)FlushPrivilegesを使用してアクセス許可を有効にすることを確認します。

MySQL文字列データ型のマスター:Varchar vs. Text vs. CharMySQL文字列データ型のマスター:Varchar vs. Text vs. CharMay 12, 2025 am 12:12 AM

choosecharforfixed-lengthdata、varcharforvariable-lengthdata、andtextforlargetextfields.1)chariseffienceforconsistent-lengthdatalikecodes.2)varcharsuitsvariaible-lengthdatalikenames、balancingflexibilityandperformance.3)Textisidealforforforforforforforforforforforidex

MySQL:文字列データ型とインデックス:ベストプラクティスMySQL:文字列データ型とインデックス:ベストプラクティスMay 12, 2025 am 12:11 AM

MySQLの文字列データ型とインデックスを処理するためのベストプラクティスには、次のものが含まれます。1)固定長のchar、可変長さのvarchar、大規模なテキストのテキストなどの適切な文字列タイプを選択します。 2)インデックス作成に慎重になり、インデックスを避け、一般的なクエリのインデックスを作成します。 3)プレフィックスインデックスとフルテキストインデックスを使用して、長い文字列検索を最適化します。 4)インデックスを定期的に監視および最適化して、インデックスを小さく効率的に保つ。これらの方法により、読み取りと書き込みのパフォーマンスをバランスさせ、データベースの効率を改善できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター