Untitled Document

                  [  ◎ PRAGMA AUTONOMOUS_TRANSACTION ]     

☞ 사용이유
 

1. 트랜잭션을 별도로 동작하기 위해

2. 에러에 대한 내용을 로깅하기 위해서 트랜잭션과는 별도로 동작하는 트랜잭션을 만들어
   에러내용을 저장한다.

 

   

☞ 생성 방법

 

1. A와 B 펑션이 있을 경우
   FUNCTION_A(
      begin
            B();
      end;
   )


   FUNCTION_B(
     as
PRAGMA AUTONOMOUS_TRANSACTION
      begin
            ...
             commit;
      end;
   )

   rollback;

   : 이때 A function에서 수행한 transaction은 Rollback되지만
          B function에서 수행한 transaction은 Commit 된다.

   
   
   

참고URL : http://cafe.naver.com/dbmodeler/93

'기타 > 임시' 카테고리의 다른 글

이미지 편집 url  (0) 2020.01.29
SQL fometter URL  (0) 2017.07.19
1. Oracle_function - F300_Record_Return_20.html  (0) 2016.11.25
1. Oracle_function - F300_Record_Return_11.html  (0) 2016.11.25
1. Oracle_function - F300_Record_Return_10.html  (0) 2016.11.25
Posted by 농부지기
,
[ ◎ 여러 레코드 Return하기 ]

                   [  ◎ 여러 레코드 Return하기 ]     

 
☞ 생성 방법

 

Oracle Function에서 대부분 한개의 값을 반환하는 경우가 대부분이다. 

하지만 한 개의 값을 반환할 경우 제약을 받는 경우가 종종 생긴다.(사실 처음이다.) 

우선 Table 단위나 Row_Type단위로 값을 리턴 할 경우  

그에 맞는 임시 Table (TYPE)을 만들어 주어야 한다.

 

1. Oracle Type만들기
 create or replace TYPE SLP AS OBJECT (
        CD VARCHAR2(100),
        CD_NM VARCHAR2(200)
 );

그런 다음 사용을 하려는 객체를 선언해주어야 한다.

 

2. 임시 TABLE(TYPE) 객체 만들기

create or replace TYPE SAMPLE_TABLE AS TABLE OF SLP;

이제 사용할 Function을 만들면 끝이다.

 

3. Functoin만들기

create or replace FUNCTION F_GET_SAMPLE_NAME(
      COMPANY_CD IN VARCHAR2
) RETURN SAMPLE_TABLE pipelined IS
        aaa
SLP := SLP(NULL, NULL);  -- 초기화(SAMPLE 구조체를 aaa로 선언)
 BEGIN
      FOR bbb IN (SELECT CD, CD_NM
                    FROM XFRMD2C
                  ) LOOP
          aaa.cd          := bbb.cd;
          aaa.cd_nm    := bbb.cd_nm;
          
PIPE ROW(aaa);  -- 검색값을 저장
      END LOOP;
      RETURN;
   EXCEPTION WHEN NO_DATA_FOUND THEN
       BEGIN
           aaa:= SLP('', '');
           
pipe row(aaa);
       END;
       RETURN;
  END
;

 

   
   
   

참고URL : http://javanara.tistory.com/19

Posted by 농부지기
,

                   [  ◎ 여러 레코드 Return하기 ]     

☞ 정의
 

1. Function의 기본은 값 하나만 넘기자만

   PIPE를 이용하면 Table단위나 Row_Type단위로 값을 리턴할 수 있다.  

2. PipeLined 라고 불리는 이유는 데이터를 찾는 즉시 바로 바로 전송해주기 때문이다.  

 

   

☞ 생성 방법 1
   
- Package 안에 Type을 생성한 예제

 

-- Package 헤더 생성

CREATE OR REPLACE PACKAGE myDemoPack
       IS

       -- 레코드 타입
       
TYPE myObjectFormat IS RECORD
        ( A INT,
          B DATE,
          C VARCHAR2(25)
        );

       -- 테이블 타입
       
TYPE myTableType IS TABLE OF myObjectFormat;   

       FUNCTION prodFunc RETURN myTableType PIPELINED;  --pipelined선언

END myDemoPack;

-- Package 바디 생성

CREATE OR REPLACE PACKAGE BODY myDemoPack AS
       
FUNCTION prodFunc RETURN myTableType PIPELINED IS

       CURSOR sel_cur IS
          
SELECT ROWNUM, SYSDATE+ROWNUM, 'Row=' || ROWNUM
            
FROM DUAL
           
CONNECT BY LEVEL <= 5;

       BEGIN
           
FOR myObjectFormat IN sel_cur
              
LOOP
                  
PIPE ROW (myObjectFormat); --바로바로 리턴
              
END LOOP;

              RETURN;   --이때 RETURN는 사실 의미 없음
           
END;
        
END;

☞ 생성 방법 2
   
- Package 안에 Type을 생성한 예제
     오류 발생.. 잘 될거 같은데.. 안됨.. 오류에 원인을 알 수 없음.
 

2. 패지지 생성
   -- 패지키 헤더 생성

   
CREATE OR REPLACE PACKAGE myDemoPack
       
IS

       -- 레코드 타입
       
TYPE myObjectFormat IS RECORD
        ( A INT,
          B DATE,
          C VARCHAR2(25)
        );
 
       -- 테이블 타입
       
TYPE myTableType IS TABLE OF myObjectFormat;

       
FUNCTION prodFunc RETURN myTableType PIPELINED;  --pipelined선언

    END myDemoPack;



   --패키지 바디 생성
   
CREATE OR REPLACE PACKAGE BODY myDemoPack AS
       
FUNCTION prodFunc RETURN myTableType PIPELINED IS
       
BEGIN
           
FOR i  IN  1 .. 5   
              
LOOP
                  
PIPE ROW (myObjectFormat(i, SYSDATE+I, 'Row' || i)); --바로바로 리턴
              
END LOOP;
              
              
RETURN;   --이때 RETURN는 사실 의미 없음
           
END;
        
END

  3. 쿼리 조회
   SELECT * FROM TABLE(myDemoPack.prodFunc());
   

참고URL : http://cafe.naver.com/dbmodeler/93

Posted by 농부지기
,

                   [  ◎ 여러 레코드 Return하기 ]     

☞ 정의
 

1. Function의 기본은 값 하나만 넘기자만

   PIPE를 이용하면 Table단위나 Row_Type단위로 값을 리턴할 수 있다.  

2. PipeLined 라고 불리는 이유는 데이터를 찾는 즉시 바로 바로 전송해주기 때문이다.  

 

   

☞ 생성 방법

 

1. Object Type을 생성한다.

   -- 레코드 타입
   
CREATE OR REPLACE TYPE myObjectFormat
       AS OBJECT
    ( A INT,
      B DATE,
      C VARCHAR2(25)
    );
 
   -- 테이블 타입
   
CREATE OR REPLACE TYPE myTableType
       AS TABLE OF
myObjectFormat

 

2. 패지지 생성
   -- 패지키 헤더 생성

   
CREATE OR REPLACE PACKAGE myDemoPack
       
AS
          
FUNCTION prodFunc RETURN myTableType PIPELINED;  --pipelined선언
   
END;

   --패키지 바디 생성
   
CREATE OR REPLACE PACKAGE BODY myDemoPack AS
       
FUNCTION prodFunc RETURN myTableType PIPELINED IS
       
BEGIN
           
FOR i  IN  1 .. 5   
              
LOOP
                  
PIPE ROW (myObjectFormat(i, SYSDATE+I, 'Row' || i)); --바로바로 리턴
              
END LOOP;
              
              
RETURN;   --이때 RETURN는 사실 의미 없음
           
END;
        
END

  3. 쿼리 조회
   SELECT * FROM TABLE(myDemoPack.prodFunc());
   

참고URL : http://cafe.naver.com/dbmodeler/93

Posted by 농부지기
,

참고 url : http://itpangpang.tistory.com/286

* 개발 방향 및 Logic

1. ActionBar를 사용하지 않는다.

2. ActionBar대신에 TextView를 통해서 ActionBar역할을 하도록 한다.

3. ViewPage이동시 swipe기능도 추가한다.

 

[drawable]-[tab_color_selector.xml]

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="#301500" android:state_selected="true" />
    <item android:color="#8C8C8C" />
</selector>

 

[drawable]-[tab_bg_off.xml]

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="2dp"
                />
            <solid android:color="#8C8C8C" />
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#EAEAEA" />
        </shape>
    </item>
</layer-list>

 

[drawable]-[tab_bg_on.xml]

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="rectangle">
            <padding
                android:bottom="5dp"
                />
            <solid android:color="#301500" />
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="#EAEAEA" />
        </shape>
    </item>
</layer-list>

 

[drawable]-[tab_bg_selector.xml]

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected="false"
        android:drawable="@drawable/tab_bg_off" />
    <item
        android:state_selected="true"
        android:drawable="@drawable/tab_bg_on" />
</selector>

 

 

[FirstFragment.java]  >>  [SecondFragment.java],   [ThirdFragment.java] 두 개 java도 생성

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#000000"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="30dp"
        android:textColor="#FFFFFF"
        android:textStyle="bold"
        android:text="첫번째 페이지"/>

</RelativeLayout>

 

[fragment_first.xml] >> [fragment_second.xml], [fragment_third.xml]  2개도 생성

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#000000"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="30dp"
        android:textColor="#FFFFFF"
        android:textStyle="bold"
        android:text="첫번째 페이지"/>

</RelativeLayout> 

 

 

[ activity_main.xml ]

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/tab_first"
            android:layout_width="0dip"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center"
            android:textColor="@drawable/tab_color_selector"
            android:background="@drawable/tab_bg_selector"
            android:text="친구" />

        <TextView
            android:id="@+id/tab_second"
            android:layout_width="0dip"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center"
            android:textColor="@drawable/tab_color_selector"
            android:background="@drawable/tab_bg_selector"
            android:text="채팅방" />

        <TextView
            android:id="@+id/tab_third"
            android:layout_width="0dip"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center"
            android:textColor="@drawable/tab_color_selector"
            android:background="@drawable/tab_bg_selector"
            android:text="설정" />
    </LinearLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/ll">
    </android.support.v4.view.ViewPager>

</RelativeLayout>

 

 

[ MainActivity.xml ]

package org.example.farmkim.study001;

import android.os.Bundle;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
{
    ViewPager vp;
    LinearLayout ll;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        vp = (ViewPager)findViewById(R.id.vp);
        ll = (LinearLayout)findViewById(R.id.ll);

        //ActionBar 역할을 TextView
        TextView tab_first = (TextView)findViewById(R.id.tab_first);
        TextView tab_second = (TextView)findViewById(R.id.tab_second);
        TextView tab_third = (TextView)findViewById(R.id.tab_third);

        //ViewPage객체에 Adapter 연결
        //이때, ViewPage에 Fragment가 연동된다.
        vp.setAdapter(new pagerAdapter(getSupportFragmentManager()));
        vp.setCurrentItem(0);

        //tab에 OnClick Event설정 및 Tag 값 지정
        tab_first.setOnClickListener(movePageListener);
        tab_first.setTag(0);
        tab_second.setOnClickListener(movePageListener);
        tab_second.setTag(1);
        tab_third.setOnClickListener(movePageListener);
        tab_third.setTag(2);

        tab_first.setSelected(true);

        //ViewPage에  Page가 변경될때 호출되는 Event 추가.
        vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
        {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {

            }

            @Override
            public void onPageSelected(int position)
            {
                int i = 0;
                while(i<3)
                {
                    if(position==i)
                    {
                        ll.findViewWithTag(i).setSelected(true);
                    }
                    else
                    {
                        ll.findViewWithTag(i).setSelected(false);
                    }
                    i++;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state)
            {

            }
        });
    }

    //Tab역할을 하는 상단 TextView를 클릭 시 Event
    View.OnClickListener movePageListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            int tag = (int) v.getTag();

            int i = 0;
            while(i<3)
            {
                if(tag==i)
                {
                    //특정 Component를 선택해준다.
                    //그럴경우, drawable안에  xml에 <selector>tag안에  state_selected="true" 속성을 찾아서 style을 적용한다.
                    ll.findViewWithTag(i).setSelected(true);
                }
                else
                {
                    ll.findViewWithTag(i).setSelected(false);
                }
                i++;
            }

            vp.setCurrentItem(tag);
        }
    };

    //ViewPager객체에 Adapter 연결.
    private class pagerAdapter extends FragmentStatePagerAdapter
    {
        public pagerAdapter(android.support.v4.app.FragmentManager fm)
        {
            super(fm);
        }
        @Override
        public android.support.v4.app.Fragment getItem(int position)
        {
            switch(position)
            {
                case 0:
                    return new FirstFragment();
                case 1:
                    return new SecondFragment();
                case 2:
                    return new ThirdFragment();
                default:
                    return null;
            }
        }
        @Override
        public int getCount()
        {
            return 3;
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'[Android] - 개념 > ViewPage 다루기' 카테고리의 다른 글

ViewPage 기본 개념  (0) 2016.11.24
ViewPager - 1단계  (0) 2016.11.24
Posted by 농부지기
,