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

由于有需要,要给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());
        }
}