登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. Platforms
  3. LINUX
  4. Oracle
  5. 正文

Oracle嵌套表,存储过程混合使用-日常笔记

2017-09-19

由于有需要,要给Oracle存储过程传递一个二维矩阵,所以研究了一下,也很容易就实现了。

一、对象定义

1.1 表定义

CREATE TABLE "test_proc_array" 
   (	"id" VARCHAR2(255), 
	"name" VARCHAR2(255)
   )

1.2 Record定义

create or replace type test_proc_array FORCE  as object
(
  -- Author  : CLAVES
  -- Created : 9/18/2017 17:04:58
  -- Purpose : 
  
  -- Attributes
  "id" NVARCHAR2(255),
  "name" NVARCHAR2(255)
  
  -- Member functions and procedures
  -- member procedure <ProcedureName>(<Parameter> <Datatype>)
);

1.3 嵌套表定义

create or replace type test_proc_array_table is table of test_proc_array;

1.4 存储过程定义

create or replace procedure test_proc(
       v_array_table test_proc_array_table
) 
as
begin
  forall i in 1..v_array_table.count
  
    insert into "test_proc_array"("id","name")
      values(v_array_table(i)."id",v_array_table(i)."name");
  commit;
end test_proc;

 

二、运行测试

2.1 运行sql

begin test_proc(test_proc_array_table(test_proc_array('112','432'),test_proc_array('claves','blog')));end;

a

结果:

三、PHP测试

/**
     * Oracle 存储过程集合Record参数序列化
     * @param $name RecordSet 名称
     * @param $params 内容数组
     * @return string
     */
    public function bind_orc_recordset_by_name($name,$params)
    {
        return $name.'('.implode(',',$params).')';
    }
    /**
     * Oracle 存储过程Record参数序列化
     * @param $name Oracle Record名称
     * @param $params Record 内容数组
     * @return string
     */
    public function bind_orc_record_by_name($name,$params)
    {
        $iplode="";
        foreach($params as $param)
        {
            if(gettype($param) =="string")
            {
                $iplode .="'".$param."'".',';
            }else{
                $iplode .=$param.',';
            }
        }
        $iplode = substr($iplode,0,strlen($iplode)-1);
        return $name.'('.$iplode.')';
    }
public function main()
{
 $tmp1 = array("a1","b1");
        $tmp2 = array("a2","b2");
        try{
            $pdo = DB::getPdo();
            $params = $this->bind_orc_recordset_by_name('test_proc_array_table',
                array(
                    $this->bind_orc_record_by_name('test_proc_array',$tmp1),
                    $this->bind_orc_record_by_name('test_proc_array',$tmp2)
                ));
            $stmt = $pdo->prepare("begin test_proc($params);end;");

            $stmt->execute();
        }catch(Exception $e)
        {
            die("Exception:n".var_dump($e->getMessage()).$e->getTrace());
        }
}

 

 

标签: 暂无
最后更新:2020-10-28

代号山岳

知之为知之 不知为不知

点赞
下一篇 >

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号