顯示具有 Oracle 標籤的文章。 顯示所有文章
顯示具有 Oracle 標籤的文章。 顯示所有文章

2013年10月28日 星期一

Using Java Custom Type In Oracle

因為PL/SQL本身沒有Mutil Thread 機制,
若需要使用到Mutil Thread 就必須利用JVM,
將任務丟給Java並繼續執行下段Statment。

本次的範例為:輸入指定的隊伍人數,JVM會自動產出隊伍成員,且回傳整支隊伍。

Oracle Function :
CREATE OR REPLACE FUNCTION CreatTeam(Num IN NUMBER)
RETURN TEAMWITHPLAYER
AS
tempNum Number;
BEGIN
    FOR i IN 1..Num
    loop
        SELECT  ROUND(DBMS_RANDOM.VALUE(20,30))into tempNum FROM DUAL;
        --addPlayer(姓名、地址、年齡)都採Random輸出
        AddPlayerToTeam.addPlayer('Name A'||i ,'Taipei No.'||i*10,tempNum);
    end loop;
  
    RETURN AddPlayerToTeam.getAll();
END;

上段程式碼為主程式,藉由輸入的Num數產生所成員數目。
最後再傳回整個Team的資料。

Oracle Package
CREATE OR REPLACE PACKAGE AddPlayerToTeam
            IS
              Procedure addPlayer( NameStr IN VARCHAR2 , AddrStr IN VARCHAR2 , AgeStr IN VARCHAR2 );      
              Function getAll Return TEAMWITHPLAYER;
            End AddPlayerToTeam;

CREATE OR REPLACE PACKAGE BODY AddPlayerToTeam
            IS
              Procedure addPlayer( NameStr IN VARCHAR2 , AddrStr IN VARCHAR2 , AgeStr IN VARCHAR2 )  as language java name 'Kunde.Test.Java.AddPlayerToTeam.addString(java.lang.String,java.lang.String,java.lang.String)';
              Function getAll Return TEAMWITHPLAYER as language java name 'Kunde.Test.Java.AddPlayerToTeam.getLog() return oracle.sql.ARRAY';
            End AddPlayerToTeam;

2013年10月14日 星期一

Oracle DB Call Java Class & ORA-29532

參考官方文件:Calling Java Methods in Oracle Database

1.寫了一個test.java,存在D:\Test底下

import java.io.*;
public class test {
   public static void main(String[] args) throws IOException {
   // TODO Auto-generated method stub
   //Hello World!!!!
      System.out.println("Hello World!!!!!!!!!!!");
      BufferedWriter out = new BufferedWriter(new FileWriter("D://output.txt"));
      try {
         String inputLine = "Hello World!!!!!!!!!!!";
         out.write(inputLine);
         out.newLine();
      } catch(IOException e1) {
         System.out.println("Error during reading/writing");
      } finally {
         out.close();
      }
   }
}

2013年9月10日 星期二

Linux yum 設定與安裝套件

參考:
How-To:用 yum 進行軟體安裝移除與更新

Yum基本操作:
使用yum可以比較簡易的安裝Linux所需的套件,
yum 會自動下載相依的套件並安裝,
以安裝VNC 為例:

查詢:
# yum search vnc

安裝:
# yum install vnc
許多 yum 操作會詢問使用者是否確定執行(y/n),如果希望 yum 自動確定而無須詢問,可加入 -y 參數,例如:
# yum -y install vnc

更新:
# yum update vnc

移除:
# yum remove vnc

已安裝的套件更新:
# yum update

清除所有 yum 快取資料;
# yum claen all

2013年8月2日 星期五

Oracle UDTs _Object with Collection

C#
--------Object with Collection---------
class LeagueDto : IOracleCustomType
{
    [OracleObjectMappingAttribute("NAME")]
    public virtual string Name { get; set; }
    [OracleObjectMappingAttribute("MEMBERS")]
    public virtual TeamWithPlayer Members { get; set; }

    public virtual void FromCustomObject(OracleConnection con, System.IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, "NAME", this.Name);
        OracleUdt.SetValue(con, pUdt, "MEMBERS", this.Members);
    }
    public virtual void ToCustomObject(OracleConnection con, System.IntPtr pUdt)
    {
        this.Name = ((string)(OracleUdt.GetValue(con, pUdt, "NAME")));
        this.Members = (TeamWithPlayer)OracleUdt.GetValue(con, pUdt, "MEMBERS");
    }
    [OracleCustomTypeMapping("LEAGUE")]
    public class LeagueFactory : IOracleCustomTypeFactory
    {
        public virtual IOracleCustomType CreateObject()
        {
            return new LeagueDto();
        }
    }
}


--------collection---------
class TeamWithPlayer : IOracleCustomType
{
    //Dto是自己的DTO
    public PlayerDto[] Value;
    public virtual void FromCustomObject(OracleConnection con, System.IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, 0, this.Value);
    }
    public virtual void ToCustomObject(OracleConnection con, System.IntPtr pUdt)
    {
        Value = (PlayerDto[])OracleUdt.GetValue(con, pUdt, 0);
    }
    [OracleCustomTypeMapping("TEAMWITHPLAYER")]
    public class TeamWithPlayerFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory
    {
        public virtual IOracleCustomType CreateObject()
        {
            return new TeamWithPlayer();
        }
        public virtual Array CreateArray(int length)
        {
            return new PlayerDto[length];
        }
        public virtual Array CreateStatusArray(int length)
        {
            return null;
        }
    }
}
--------DTO---------
class PlayerDto : IOracleCustomType
{
    [OracleObjectMappingAttribute("NAME")]
    public virtual string Name { get; set; }
    [OracleObjectMappingAttribute("ADDRESS")]
    public virtual string Address { get; set; }
    [OracleObjectMappingAttribute("AGE")]
    public virtual decimal Age { get; set; }
    public virtual void FromCustomObject(OracleConnection objCon, IntPtr objUdt)
    {
        OracleUdt.SetValue(objCon, objUdt, "NAME", this.Name);
        OracleUdt.SetValue(objCon, objUdt, "ADDRESS", this.Address);
        OracleUdt.SetValue(objCon, objUdt, "AGE", this.Age);
    }
    public virtual void ToCustomObject(OracleConnection objCon, IntPtr objUdt)
    {
        this.Name = ((string)(OracleUdt.GetValue(objCon, objUdt, "NAME")));
        this.Address = ((string)(OracleUdt.GetValue(objCon, objUdt, "ADDRESS")));
        this.Age = ((decimal)(OracleUdt.GetValue(objCon, objUdt, "AGE")));
    }
    [OracleCustomTypeMappingAttribute("PLAYER")]
    public class PlayerFactory : IOracleCustomTypeFactory
    {
        public virtual IOracleCustomType CreateObject()
        {
            PlayerDto obj = new PlayerDto();
            return obj;
        }
    }
}
-------Main---------
static void Main(string[] args)
{
    Console.WriteLine("Welcome to using C# Custom Object and Oracle User-defined Types:");
    Console.WriteLine("Using DTO & UDTs with procedure to change the Player's age ");
    LeagueDto objLeague = new LeagueDto();
    PlayerDto objPlayer = new PlayerDto();
    objPlayer.Name = "Mr. Syscom";
    objPlayer.Address = "台北市108萬華區峨眉街115號";
    objPlayer.Age = 20;
    PlayerDto objPlayer2 = new PlayerDto();
    objPlayer2.Name = "Mr. Syscom2";
    objPlayer2.Address = "台北市108萬華區峨眉街115號";
    objPlayer2.Age = 30;

    objLeague.Name = "Group 1";
    objLeague.Members = new TeamWithPlayer();
    objLeague.Members.Value = new PlayerDto[2] { objPlayer, objPlayer2 };

    Console.WriteLine("Player1 Age was " + objLeague.Members.Value[0].Age);
    Console.WriteLine("Player2 Age was " + objLeague.Members.Value[1].Age);
    String ConnectionString = ConfigurationManager.ConnectionStrings["ABC"].ConnectionString;

    // Establish the connection with Oracle
    using (OracleConnection objCon = new OracleConnection(ConnectionString))
    {
        // Open the connection
        objCon.Open();
        // Insert the Person object into database table
        using (OracleCommand cmd = new OracleCommand("AlterLeague", objCon))
        {
            cmd.CommandType = CommandType.StoredProcedure; //Database store procedure

            // Oracle Paramater
            OracleParameter objParam = new OracleParameter();
            //Denotes, we are going to pass a custom object
            objParam.OracleDbType = OracleDbType.Object;

            objParam.Direction = ParameterDirection.InputOutput;
            // Note: The UdtTypeName is case-senstive - Should be in upper case
            objParam.UdtTypeName = "LEAGUE";
            // Attach custom object as input parameter
            objParam.Value = objLeague;

            //Attach parameter to command object
            cmd.Parameters.Add(objParam);

            // Insert the UDT into the table
            cmd.ExecuteNonQuery();

            objLeague = (LeagueDto)cmd.Parameters[0].Value;
        }
    }
    Console.WriteLine("After alter the age:");
    Console.WriteLine("Player1 Age is " + objLeague.Members.Value[0].Age);
    Console.WriteLine("Player2 Age is " + objLeague.Members.Value[1].Age);
    Console.ReadLine();        
}
-----Procedure---------
CREATE OR REPLACE procedure
                EEP.AlterLeague(L_LEAGUE IN OUT LEAGUE) as
begin
    L_LEAGUE.MEMBERS(1).age:=22;
    L_LEAGUE.MEMBERS(2).age:=32;
end AlterLeague;
Object with collection in Oracle
CREATE OR REPLACE TYPE EEP.LEAGUE AS OBJECT
(
    name varchar2(30),
    MEMBERS TEAMWITHPLAYER
)NOT FINAL
--------Collection in Oracle---------
CREATE OR REPLACE TYPE EEP.TEAMWITHPLAYER AS TABLE OF PLAYER
----------Object---------
CREATE OR REPLACE
TYPE  EEP.PLAYER AS OBJECT
(
    name varchar2(30),
    address varchar2(60),
    age number(3)
)NOT FINAL
----------Result---------

2013年5月14日 星期二

Oracle UT 自製Assert

參考Oracle PL/SQL 5th

Oracle沒有提供UT的元件,
所以必須要自己撰寫類似Assert的檢核機制。
ex.
PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN VARCHAR2, actual_value  IN VARCHAR2) --驗證用
IS
BEGIN
    DBMS_OUTPUT.PUT(description || ': ');
    IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
        THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
        ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
    END IF;
END;
PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN NUMBER, actual_value IN NUMBER) --驗證用
IS
BEGIN
    DBMS_OUTPUT.PUT(description || ': ');
    IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
        THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
        ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
    END IF;
END;
-------------------------------
<!--more>
所以UT的撰寫時,可以獨立的把上述兩個Procedure撰寫在oracle中,
或者可以直接寫在Declare裡。
ex.
Declare
    A number;--預計資料筆數
    B number;--實際資料筆數(從table撈)
    PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN VARCHAR2, actual_value  IN VARCHAR2) --驗證用
    IS
    BEGIN
        DBMS_OUTPUT.PUT(description || ': ');
        IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
            THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
            ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
        END IF;
    END;
    PROCEDURE ASSERT (description IN VARCHAR2 , expected_value IN NUMBER, actual_value IN NUMBER) --驗證用
    IS
    BEGIN
        DBMS_OUTPUT.PUT(description || ': ');
        IF expected_value = actual_value OR (expected_value IS NULL AND actual_value IS NULL) 
            THEN DBMS_OUTPUT.PUT_LINE('PASSED'); 
            ELSE DBMS_OUTPUT.PUT_LINE('FAILED. Expected ' || expected_value || '; got ' || actual_value); 
        END IF;
    END;

BEGIN
       A : =10;(預計10筆)
       SELECT Count(*) INTO B FROM table;
       ASSERT('筆數檢核:',A,B) ;
END;
------------------------------------------------------------------------------------------------
結果(DBMS_OUTPUT):
通過→
筆數檢核:PASSED
失敗→
筆數檢核:FAILED. Expected : 10 ;got 9

2013年5月7日 星期二

2013年5月3日 星期五

2013年4月30日 星期二

使用DBMS_UTILITY.format_error_backtrace

DBMS_UTILITY.format_error_backtrace

For Oracle 10g以上的EXCEPTION TRACE~

Sample from book :
------------------------PK spec-----------------------------
CREATE OR REPLACE PACKAGE EEP.ERRORTEST
AS
    PROCEDURE proc1;
    PROCEDURE proc2;
    PROCEDURE proc3;
END;

2013年4月25日 星期四

Auto increase column in Oracle


Auto increase column
1.      開啟青蛙
2.      點選Sequences
3.      在空白處按右鍵→Creat Sequence


2.      輸入以下資料,按下OK即可,Sequence Name 請輸入你要的 ex: XXXXXX
3.      使用方式:
1.      "INSERT INTO Table VALUES(XXXXXX .NEXTVAL, BrokerId , TermId, SeqNo, Stock, BSCode, MthQty, ’ MthPrice, SendFlag)"
Ex: "INSERT INTO MATCH VALUES(XXXXXX .NEXTVAL,’9898’, ‘A’, ‘0001’, ‘2330’, ’B’, ‘30’, ’20.2’, 'F')";
2.取出目前櫃號:SELECT XXXXXX.CURRVAL FROM DUAL
3.取用一組新的值:SELECT XXXXXX. NEXTVAL FROM DUAL
6. 刪除Sequence


2013年4月11日 星期四

C#DTO collection & Oracle UDTs Collection

C#--- class
class SimpleTable : IOracleCustomType
{

    [OracleArrayMapping()]
   //Dto是自己的DTO
    public Dto[] Value;
    public virtual void FromCustomObject(OracleConnection con, System.IntPtr pUdt)
    {
            OracleUdt.SetValue(con, pUdt, 0, this.Value);
    }

    public virtual void ToCustomObject(OracleConnection con, System.IntPtr pUdt)
    {
        Value = (Dto[])OracleUdt.GetValue(con, pUdt, 0);
        //this.Value = ((Dto[])(OracleUdt.GetValue(con, pUdt, 0)));
    }
    [OracleCustomTypeMapping("TESTTABLE")]
    public class SimpleTableFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory
    {
        public virtual IOracleCustomType CreateObject()
        {
            return new SimpleTable();
        }

        public virtual Array CreateArray(int length)
        {
            return new Dto[length];
        }

        public virtual Array CreateStatusArray(int length)
        {
            return null;
        }
    }
}

2013年4月3日 星期三

C# ARRAY n Oracle UDTs VARRAY

參考網址:http://www.codeproject.com/Articles/33829/How-to-use-Oracle-11g-ODP-NET-UDT-in-an-Oracle-Sto

C#--- class
public class SimpleVarray : IOracleCustomType, INullable
{
    [OracleArrayMapping()]
    public string[] Array;
    private bool m_bIsNull;
    public bool IsNull
    {
        get
        {
            return m_bIsNull;
        }
    }
    public static SimpleVarray Null
    {
        get
        {
            SimpleVarray obj = new SimpleVarray();
            obj.m_bIsNull = true;
            return obj;
        }
    }
    public void ToCustomObject(OracleConnection con, IntPtr pUdt)
    {
        object objectStatusArray = null;
        Array = (string[])OracleUdt.GetValue(con, pUdt, 0, out objectStatusArray);
    }
    public void FromCustomObject(OracleConnection con, IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, 0, Array);
    }
}

[OracleCustomTypeMapping("EEP.TESTVARRAY")]
public class SimpleVarrayFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory
{
    public IOracleCustomType CreateObject()
    {
        return new SimpleVarray();
    }
    public Array CreateArray(int numElems)
    {
        return new string[numElems];
    }
    public Array CreateStatusArray(int numElems)
    {
        return null;
    }
}
C#----main
private static void OrderReport()
{  
    SimpleVarray test = new SimpleVarray();
    test.Array = new string[]
    {
        "A","B","C","D", "E","F","G","H",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
    };
    String ConnectionString = ConfigurationManager.ConnectionStrings["ABC"].ConnectionString;
    using (OracleConnection conn = new OracleConnection(ConnectionString))
    {
        conn.Open();
        using (OracleCommand cmd = conn.CreateCommand())
        {
            try
            {
                cmd.CommandText = "TEST";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("V_List", OracleDbType.Array).Direction = ParameterDirection.Input;
                cmd.Parameters[0].Value = test;
                cmd.Parameters[0].UdtTypeName = "TESTVARRAY";
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.WriteLine("1");
            Console.ReadLine();
        }
    }
}
ORACLE TYPE---
TYPE "TESTVARRAY" AS VARRAY(3000) OF VARCHAR(30)

ORACLE STORED PROCEDURE---
PROCEDURE TEST(V_List IN TESTVARRAY) AS
    BEGIN
        INSERT INTO AAAA (A, B,C, D, E, F, G, H, DATETIME) VALUES(V_List(1), V_List(2), V_List(3), V_List(4), V_List(5), V_List(6), V_List(7), V_List(8), to_timestamp(V_List(9), 'yyyy-mm-dd hh24:mi:ss.ff3'));
    END;

2013年4月1日 星期一

C# DTO n Oracle UDTs

參考網址:
http://www.codeproject.com/Articles/141728/Interaction-between-C-Application-and-Oracle-throu
C# DTO
class PersonDto : IOracleCustomType
    {
    [OracleObjectMappingAttribute("PNAME")]
    public virtual string Name { get; set; }
    [OracleObjectMappingAttribute("ADDRESS")]
    public virtual string Address { get; set; }
    [OracleObjectMappingAttribute("AGE")]
    public virtual decimal Age { get; set; }
    public virtual void FromCustomObject(OracleConnection objCon, IntPtr objUdt)
    {
        OracleUdt.SetValue(objCon, objUdt, "PNAME", this.Name);
        OracleUdt.SetValue(objCon, objUdt, "ADDRESS", this.Address);
        if (this.Age > 0) OracleUdt.SetValue(objCon, objUdt, "AGE", this.Age);
    }
    public virtual void ToCustomObject(OracleConnection objCon, IntPtr objUdt)
    {
        this.Name = ((string)(OracleUdt.GetValue(objCon, objUdt, "PNAME")));
        this.Address = ((string)(OracleUdt.GetValue(objCon, objUdt, "ADDRESS")));
        bool AgeIsNull = OracleUdt.IsDBNull(objCon, objUdt, "AGE");
        if ((AgeIsNull == false)) this.Age =
            ((decimal)(OracleUdt.GetValue(objCon, objUdt, "AGE")));
    }
    [OracleCustomTypeMappingAttribute("PERSON")]
    public class PersonFactory : IOracleCustomTypeFactory
    {
        public virtual IOracleCustomType CreateObject()
        {
            PersonDto obj = new PersonDto();
            return obj;
        }
    }
}

2013年3月21日 星期四

Zabbix安裝SOP

環境
OS: Linux RedHat 5.5

1.安裝 RedHat5.5
因為該死的Zabbix只能安裝在Linux系統上,再加上公司決定使用RedHat作為資料庫的系統,所以我們只好安裝這不熟悉的小紅帽(不然筆者超想用Ubuntu)。
首先拿出RedHat光碟片放進光碟機裡開始安裝,
接著安裝細節就不多說了,
這裡提醒一點,
因為之後安裝Zabbix時需要PHP5. MySQL. Apache2..等套件,
而安裝這些套件又需要其他雜七雜八套件的相依性,
所以建議把相關的套件能勾的就勾吧。

2.檢查安裝套件
安裝完RedHat後,
我們要檢查套件是否有安裝,
輸入以下指令來檢查PHP5. MySQL與相關套件是否有安裝:
# rpm -qa | grep mysql
# rpm -qa | grep php
以此類推檢查所需的套件
(zlib-devel. openssl-devel. libxml2-devel. flex. bison. gcc. automake. autoconf. snmp. 
rrdtool. php-gd. php-mysql. php-pear. apache2. mysql. php...),
如果沒有的話就拿出光碟一一的安裝吧,
安裝時可以直接Double Click rpm套件檔安裝,
也可用指令進行安裝:
# rpm -ivh <package name>

2013年3月20日 星期三

看懂AWR


原始出處AWR分析


Host CPU (CPUs: 4 Cores: 2 Sockets: 1)
Load Average BeginLoad Average End%User%System%WIO%Idle
4.94.091.2
  • 在OS來說CPU的使用率=Busy + Idle→所以在這裡Busy%=1-91.2=8.8%
  • 搭著Operating System Statistics看
    • %User = USER_TIME/(BUSY_TIME+IDLE_TIME)*100 
      • 18457/(33590+345995)*100=4.86 
    • %Sys  = SYS_TIME/(BUSY_TIME+IDLE_TIME)*100
      • 15133/379585=3.98
    • %Idle = IDLE_TIME/(BUSY_TIME+IDLE_TIME)*100
      • 345995/379585=91.15

Operating System Statistics

  • *TIME statistic values are diffed. All others display actual values. End Value is displayed if different
  • ordered by statistic type (CPU Use, Virtual Memory, Hardware Config), Name
StatisticValueEnd Value
AVG_BUSY_TIME8,372
AVG_IDLE_TIME86,474
AVG_SYS_TIME3,761
AVG_USER_TIME4,590
BUSY_TIME33,590
IDLE_TIME345,995
SYS_TIME15,133
USER_TIME18,457
RSRC_MGR_CPU_WAIT_TIME0
VM_IN_BYTES66,340,137,790,754,816
VM_OUT_BYTES-144,554,992,965,316,608
PHYSICAL_MEMORY_BYTES8,470,183,936
NUM_CPUS4
NUM_CPU_CORES2
NUM_CPU_SOCKETS1
  • BUSY_TIME + IDLE_TIME = ELAPSED_TIME * CPU_COUNT
  • 至于DB对CPU的利用情况,这就涉及到10g新引入的一个关于时间统计的视图了, v$sys_time_model,简单而言,Oracle采用了一个统一的时间模型对一些重要的时间指标进行了记录,具体而言,这些指标包括:
1) background elapsed time
    2) background cpu time
          3) RMAN cpu time (backup/restore)
1) DB time
    2) DB CPU
    2) connection management call elapsed time
    2) sequence load elapsed time
    2) sql execute elapsed time
    2) parse time elapsed
          3) hard parse elapsed time
                4) hard parse (sharing criteria) elapsed time
                    5) hard parse (bind mismatch) elapsed time
          3) failed parse elapsed time
                4) failed parse (out of shared memory) elapsed time
    2) PL/SQL execution elapsed time
    2) inbound PL/SQL rpc elapsed time
    2) PL/SQL compilation elapsed time
    2) Java execution elapsed time
    2) repeated bind elapsed time
  • 紅色的兩個CPU時間才需要注意,並且在Time Model Statistics也可以看到。