1. 큰 따옴표는 변수 값으로 치환되고 작은 따옴표는 변수명 자체를 출력

# message="Hello" (등호 사이에 공백이 없어야 함)

# echo "$message"

Hello


# echo '$message'

$message


2. 큰 따옴표 안에 $를 문자로 쓰고 싶으면 \ 를 사용

# echo "\$message = $message"

$message = Hello


3. 큰 따옴표 안에 변수명과 다른 문자를 계속 적을 경우에는 변수명을 {} 로 감쐄

# echo "${message}Word"

HelloWord


4. 큰 따옴표 안에 큰 따옴표를 사용할려면 \를 사용

# echo "Hello \"World\""

Hello "World"


5. 작은 따옴표안에 작은 따옴표는 사용할 수 없으나 다음과 같이 사용은 가능

# echo 'Hello '\''World'\'

Hello 'World'


'Hello ' + \' + 'World' + \' 와 같은 의미임


6. 큰 따옴표 없이 변수만 사용할 때 변수 값에 * ? 등 와일드카드가 있으면 파일명을 표시, 일치하는 파일명이 없으면 그대로 표시

# touch HelloWorld.txt

# message="Hello*"

# echo $message

HelloWorld.txt


# rm HelloWorld.txt

# echo $message

Hello*


7. 조건식

[[ 조건식 ]] 으로 조건 판별

-z 문자열 : 빈문자열

-n 문자열 : 빈문자열 아님

문자열 == 문자열 : 문자열 패턴 일치 (= 도 같은 의미)

문자열 != 문자열 : 문자열 패턴이 일치하지 않음

-e 파일명 : 파일이 존재함

-d 파일명 : 디렉토리

-h 파일명 : 심볼릭 링크

-f 파일명 : 일반 파일

조건1 && 조건2 : 모두 true

조건1 || 조건2 : 둘 중 하나만 true

!조건1 : 조건이 성립하지 않음

true : 언제나 성립

false : 언제나 성립하지 않음

0 : true

0 이외의 값 : false

#! /bin/sh

message="Hello"


if [[ $message == "Hello" ]]; then

echo "Hello World"

fi


8. 커맨드 값

커맨드 리턴값 0 : true

커맨드 리턴값 0 이외의 값 : false

$? : 바로 이전에 실행한 커맨드의 리턴값

if grep "Hello" /tmp/tmp0 >/dev/null 2>&1; then # grep 에 매칭하는 문자가 있으면 0 을 리턴 true

echo "Hello World"

if


grep "Hello" /tmp/tmp0 >/dev/null 2>&1

rc=$?

if [[ $rc -eg 0 ]]; then

echo "Hello World"

if


9. 배열

{} : 배열 참조

{#} : 배열의 갯수

@ : 배열을 나열

$0 : 쉘스크립트 명령어

$1~$9 : 쉘스크립트의 인수 참조

$@ : 쉘스크립트 명령어 포함 모든 인수 나열

shift : 쉘스크립트 인수를 shift 지정한 횟수만큼 shift 한다.

파일명 : params.sh


#! /bin/sh


# fruits[0]="Apple"

# fruits[1]="Grape"

# fruits[2]="Orange"

# echo "${fruits[0]}" "${fruits[1]}" "${fruits[2]}"

Apple Grape Orange


# fruits=( "Apple" "Grape" "Orange" )

# echo "${fruits[0]}" "${fruits[1]}" "${fruits[2]}"

Apple Grape Orange


# echo "${#fruits[@]}"

3

# echo "${fruits[@]}}"

Apple Grape Orange


# echo $0

for item in "$@"; do

echo $item

done


while [[ "$@" != "" ]]; do

echo "$@"

shift

done


10. 커맨드 치환과 수치연상

$() : 커맨드를 출력 결과

$(()) : 수치 연산

# message="sh 의 경로는 $(which sh) 입니다."

# ehco $message

sh 의 경로는 /bin/sh 입니다.


11. 서버 리스트의 free 메모리 보기

파일명 : servers.txt

root@server01.com

root@server02.com

root@server03.com

파일명 : servers.sh

#! /bin/sh


file=$1

shift


while read server; do

ssh -n "$server" "$@" 2>$1 | sed "s/^/$server: /" &

done <"$file"

wait

# ./servers.sh servers.txt free


'Database > Server' 카테고리의 다른 글

리눅스 date 명령 : 어제(과거) , 내일(미래) 날짜, 시간 구하기  (0) 2013.10.11
# ACL (Access Control List)  (0) 2010.06.10
RSH 설정  (0) 2010.06.10
lsvg 명령어  (0) 2010.05.26
RAID 종류 및 설명  (0) 2010.05.20

 

과거


date -d 'yesterday'		# 어제
date -d '1 day ago' # 1일전 = 어제
date -d '2 day ago' # 2일전
date -d '35 day ago' # 20일전
date -d '1 week ago' # 1주일전
date -d '2 month ago' # 1달전
date -d '3 year ago' # 3년전
date -d '10 second ago' # 10초전
date -d '20 minute ago' # 20분전
date -d '30 hour ago' # 30시간전
date -d '3 year 7 month ago' # 3년 7개월전



미래

* 과거에서 ago 를 빼면 됨

date -d 'tomorrow'		# 내일
date -d '1 day' # 1일후 = 내일
date -d '2 day' # 2일후
date -d '35 day' # 20일후
date -d '1 week' # 1주일후
date -d '2 month' # 1달후
date -d '3 year' # 3년후
date -d '10 second' # 10초후
date -d '20 minute' # 20분후
date -d '30 hour' # 30시간후
date -d '3 year 7 month' # 3년 7개월후


요일 기준


date -d 'this friday'	# 이번주 금요일
date -d 'last monday' # 지난 월요일
date -d 'next tuesday' # 다음 화요일


특정 시간을 기준으로 날짜 더하고 빼기


date -d '2010-01-03 07:32:10 + 2 day 5 hours 17 minute'	
# 2010년 1월 3일 7시 32분 10초를 기준으로 2일 5시간 17분후


옵션 1


-d 는 --date 옵션으로 사용해도 됩니다. --date 로 쓸때에는 --date= 형식으로 사용하시면 됩니다.

date --date='2 month'


옵션 2


시간단위를 나타내는 day, week, month, year, second, minute, hour 등은 뒤에 s(복수)를 붙여도 되고 안붙여도 됩니다.

date -d '1 day ago'
date -d '1 days ago'


옵션 3


시간을 원하는 형식으로 뽑기위해서는 아래같이 하시면 됩니다.

현재 시간으로부터 2일전의 년-월-일 시:분:초 형식으로 표시하려면

date '+%Y-%m-%d %H:%M:%S' -d '2 day ago'


쉘스크립트에서 해당 시간을 변수에 담기


보통 위와 같은 date 함수는 주로 쉘스크립트에서 사용하게 됩니다. 리눅스 명령으로 가져온 결과값을 변수에 담으려면

yesterday=$(date -d '1 day ago')

또는

yesterday=`date -d '1 day ago'`

변수를 사용할때는

echo $yesterday

'Database > Server' 카테고리의 다른 글

쉘스크립트  (0) 2014.05.09
# ACL (Access Control List)  (0) 2010.06.10
RSH 설정  (0) 2010.06.10
lsvg 명령어  (0) 2010.05.26
RAID 종류 및 설명  (0) 2010.05.20

1. MongoDB완벽 가이드- 4장 쿼리하기발표 : 유유(유장혁)

2. 순서찾기 소개쿼리 조건형 특정 쿼리$where 쿼리커서커서 내부 작동


3. 찾기 소개


4. Find 메소드db.c.find( )컬렉션 C 안의 모든 문서를 반환find 메소드에 쿼리 문서가 없다면 빈 쿼리 문서 {}로 인식빈 쿼리 문서(즉,{})는 컬렉션 내 모든 것과 일치한다검색 제한키 /값 쌍db.users.find( { "age" : 27 } )조건1 AND 조건2 AND . . . AND 조건N


5. 반환 받을 키 지정하기모든 키/값 정보가 필요한 건 아닐 경우db.users.find ( { }, ( " username" : 1, "email" : 1 } )“_id" 키는 특별히 지정하지 않아도 항상 반환특정 키 /값 쌍을 제외db.users.find( { }, { “username" : 0 } )


6. 제약 사항쿼리의 값은 데이터베이스 관점에서는 반드시 상수여야 한다 (코드 내에서는 일반 변수여도 상관 없다)문서 내 다른 키의 값을 참조할 수 없음> db.stock.find( { "in_stock" : "this.num_sold" } ) / / 작동하지 않는다.


7. 쿼리 조건


8. 쿼리 조건절비교 연산자"$lt" - <"$lte" - <="$gt" - >"$gte" - >=> db.users.find ( { " age " : { " $gte " 18, " $lte " : 30 } } )"$ne" - != ‘not equal'


9. OR 쿼리"$in“ 반대 "$nin"하나의 키 에 대해 다양한 값들과 비교하는 쿼리에 사용> db.raffle.find( { "ticket_no" : { "$in“ : [ 725, 542, 390 ] } } )다른 데이터형도가능> db.users.find( { "user_id" : { "$in" : [ 12345, "joe" ] } )"$or" 조금 더 일반적인 것이며 여러 키에 대해 주어진 값을 비교하는 쿼리에 사용가능한 조건들의 배열> db.raffle.find( { "$or" : [ { "ticket_no" : 725 }, { “winner " : true } ] } )> db.raffle.find ( { "$or " : [ { "ticket_no" : { "$in" : [ 725, 542, 390] } } , { "winner" : true } ] } )


10. $not"$not“메타 조건절특히 정규표현식과 함께 사용해 주어진 패턴과 일치하지 않는 문서를 찾을 때 유용하다결과와 일치하지 않는 문서내 값> db.users.find ( { "id_num" : { "$not" : { "$mod " : [ 5, 1 ] } } } )


11. 조건절의 법칙접두사 $를 가진 키들의 위치가 다르다조회 쿼리에서 "$lt"는 내부 문서에서 사용하고 갱신 쿼리에서 “$inc"는 외부 문서를 위한 키다조건절을 내부 문서의 키로,제한자는 외부 문서의 키로 사용한다.하나의 키에 여러 조건을 걸 수 있다.하나의 키에 여러 조건절을 사용할 수 있다.하나의 키에 여러 갱신 제한자는사용할 수 없다


12. 형 특정 쿼리


13. nullnull은 자신과 일치하는 것 뿐만 아니라 “존재하지 않는” 것과도 일치만약 값이 null인 키 만 찾고 싶다면,"$exists" 조건절을 사용해 키 가 null인 키의 존재 여부를 확인할 수 있다.> db.c.Find ( { "z" : { "$in" : [ null ], "$exists" : true } } )


14. 정규표현식유연하게 매칭되는 문자열을 찾아 낼 때 / 대소문자 구별 없이 찾을 수 있다> db.users.find( { "name" : / joe/ i } )정규표현식의 플래그 (i)는 사용할 수 있으나 꼭 필요한 것은 아니다.> db.users.find ( { "name" : / joey? / i } )PCRE = Perl Compatible Regular Expression = Perl 호환 정규표현식/joey?/prefixregular-expression = 프리픽스정규표현식/^joey/해당하는 쿼리를 더 빠르게 실행


15. 배열에 쿼리하기배열의 각 요소는 대개 전체 키의 값인 것처럼 다룰 수 있다전체 배열 모두와 정확하게 일치하는 것을 쿼리할 수도 있다.배열 내 특정 요소를 쿼리하려면,key.index구문을 사용하여 순서를 지정할 수 있다.배열은 항상 0에서 시작> db. food.find( { "fruit.2" : "peach"})


16. $all 연산자배열 내 하나 이상의 요소가 일치하는 배열을 찾을 때> db. food.find ( { “fruit” : { $all : [ "apple“, "banana" ] } } )$size 연산자주어진 크기의 배열을 반환> db.food.find( { "fruit“ : {"$size" : 3}})"$size'’는 다른 $ 조건절과결합하여 사용할 수 없지만, 문서에 ”size”키를 추가하면 이런 쿼리를 처리할 수 있다값의 증가는 매우 빠르게 이루어지므로 성능에 대해서는 크게 걱정할 필요가 없다> db.food.find( { "size“ : { "$gt“ : 3 } } )


17. $slice 연산자배열 요소의 부분 집합을 반환오프셋과 요소 개수를 사용하여 원하는 범위에 있는 결과를 반환> db. blog. posts. findOne ( criteria,{ "comments" : { "$slice" : -10 } } ) // 끝에서 10> db.blog. posts. findOne ( criteria,{ "comments“ : { "$slice" : [ 23,10] } } ) // 24 ~ 34특별히 명시하지 않는 한,"$slice" 연산자는 문서 내 모든 키를 반환한다키 명시자에 직접 지정하지 않아도 "title"과 "content" 키 모두를 반환한다.


18. 내장 문서에 쿼리하기전체 문서 혹은 내장 문서 내 각 키/값 쌍을 대상가능하다면 내장 문서를 쿼리할때는 특정 키나 키들을 가지고 쿼리하는 방법이 좋다전체 문서를 대상으로 ‘정확한 일치’를 찾는 방법이 아니기 때문에 스키마가 변경되더라도 모든 쿼리 가 정상적으로 작동된다점 표기 법을 사용 // URL 형식> db. people. find ( { "name. first" : "Joe", "name.last“ : "Schmoe" } )점을 포함할 수 있고 이는 ‘내장 문서 내 항목에 접근’할 수 있다는 뜻이다URL을 키로 삼을 때 잦은 문제를 야기시킨다


19. "$elemMatch“모든 키를 지정하지 않고도 조건을 정확하게 묶을 때 사용배열 내에서 하나의 내장 문서를 찾기 위한 조건을 부분적으로 지정할 수 있도록 해준다조건의 ‘그룹핑’을 지원한다내장 문서 에 하나 이상의 키에 대 해 조건과 일치 여부를 확인할 때만 필요하다> db. blog.find ( { "comments“ : { "$elemMatch“ : { "author" : "joe" , "score" : ( "$gte" : 5 } } } } )


20. $where 쿼리


21. 표현할 수 없는 쿼리들은 임의의 자바스크립트를 쿼리의 일부분으로 실행일반 쿼리보다 훨씬 느리다각 문서는 BSON에서 자바스크립트 객체로 변환해야 하기 때문쓸 수 있는 색 인도 없다두 키 의 값을 비교하는 쿼리> db. foo. find ( { "$where“ : function ( ) { ... };문자열> db. foo.find( { "$where" : "this. x + this. Y == 10" } )> db. foo. find ( { "$where" : "function( ) { return this. x + this. y == 10; } " } )


22. 커서

23. 쉘에서커서를 생성하기 위해서는 문서들을 컬렉션에 집어넣고,그에 대해 쿼리를 수행하고, 결과를 지역 변수”var”로 선언된 변수들은 지역 변수이다)에 할당> var cursor db.collection.find( ) ;한 번에 하나씩 결과를 볼 수 있다쉘에서실제 프로그래밍을 하기에는 적합하지 않다.커서의 next 메소드를사용> while ( cursor.hasNext( ) ) { obj cursor.next( ); }반복자iterator 인터페이스를 구현하고 있어서 forEach반복문에사용> cursor. forEach ( function( x ) { } );


24. 쉘은 데이터베이스에 바로 쿼리하지않는다커서 객 체 상의 거의 모든 메소드는 커 서 자체를 반환하기 때문에 이 메소드들을 어 떤 순서로도 이 어 쓸 수 있다이 시 점 에서 쿼 리 는 아직 수행되지 않았다. 쿼 리를 만들기 만 했을 뿐이다> cursor. hasNext( )쉘은next 나hasNext메 소드 호출 시 서버 까지 왕복 횟수를 줄이기위해서한 번에 처음 100개 또는 4MB 크기의 결과(둘 중 작은 것)를 가지고 온다


25. 제한, 건너뛰기, 정렬제한limit 함수> db.c.find().limit(3)건너뛰기> db.c.find().skip(3)정렬객체를 매개 변수로 받는다키/값 쌍의 셋이고,키는 키의 이름이고, 값은 정 렬방향이다정렬 방향은 1(오름치순)이 거 나 -1(내림차순)> db.c.find().sort({ username : 1, age : -1 } )조합> db.stock.find( { "desc" : "mp3" } ). limit(50).skip(50).sort ( { "price“ : -1 } )


26. 비교 순서데 이 터 형을 비교하는 위계 구조최소값헝null형숫자형(정수형, 롱형, 더블형)문자열형객체 문서형배열형이진 데이터형객체 ID형불리언형날짜형타임스탬프형Timestamp정규표현식형최대값형


27. 많은 수의 skip 피하기많은 수의 결과에서 skip은 느릴 수 있다문서 자체에 조건을 만들어두거나, 또는 바로 전 쿼리의 결과를 가지고 다음 쿼리를 계산할Skip을 사용하지 않고 페이지 나누기Limit 를 사용하여 첫 번째 페이지를 반환하고 다음 페이지들은 첫 페이지부터 오프셋을 주어 반환하는 것이다> var page1 = db.foo.find( criteria ).limit (100)> var page2 = db.foo.find ( criteria ).skip (100). limit(100 )


28. 문서 랜덤 찾기순진한(그리고 느린) 방법은 문서의 전체 개수를 세고 find를 한 후,0부터 컬렉션의 크기 사이의 랜덤으로 정 해진 숫자만큼 건너뛰는 것이다.결국 컬렉션에서 랜덤으로 요소를 봐야 한다면 훨씬 효율적 인 방법 문서를 입력 할 때 랜덤 키를 별도로 추가하는 것이다skip을 사용하는 대신에 랜덤 수를 계산해 사용할수있다랜덤 키가 색인되었는지 명확히 해야 한다


29. 고급 쿼리 옵션일반형 쿼리형태> var cursor = db.foo.find ( { "foo" : "bar" } )감싼형 쿼리형태> var cursor = db.foo. find({ "foo" : "bar"}) .sort ({"x" : 1})$maxscan : 정수형쿼리에서 살펴볼 문서의 최대 숫자를 지정$min : 문서형쿼리의 시작 조건$max : 문서형쿼리의 끝 조건$hint : 문서형서버에 쿼 리 에 서 사용할 색 인을 일러준다$explain : 불리언형쿼리가 어떻게 수행될 것인지에 대한 설명 (사용된 인텍스, 결과의 개수, 수행 시간)$snapshot : 불리언형쿼리를 수행한 시점 후의 일관된 스냅샷을 유지할 것을 지정


30. 커서 내부 작동


31. 커서클라이언트가 보는 커서클라이언트 커서 가 나타내는 데이터베이스가 보호 커서커서는 메모리와 자원을 점유한다커서를 종료하는 (그리고 이후 작업도 정리함) 조건커서는 조건과 일치하는 결과를 모두 살펴본 후에는 스스로 정리한다커서가 클라이언트 측에서 유효 영역 비깥으로나갈 경우,드라이버는 데이터베이스에 특별한 메시지를 보내 커서를 종료해도 된다고 알린다시용자가 결과를 아직 다 살펴보지 않았고, 커서가 여전히 유효 영역 내에 있더라도 10분 동안 활동이 없으면 데이터베이스 커서는 자동으로 죽는다 (타임이웃에 의한 종료)타임아웃을 못하게 하는 immortal 이라는 함수커서의 타임아웃을 비활성화했다면 반드시 결과를 모두 살펴보거나 또는 명확히 커서를 종료해야 한다. 그렇지 않으면 커서는 데 이 터 베이스에 계속 남아 자원을 점유할 것이다.


http://www.slideshare.net/niddo/mongo-d-b

'Database > DB Tip' 카테고리의 다른 글

서브 쿼리 종류  (0) 2010.04.02
DB 전문가로 산다는 것 (1)  (1) 2010.01.22

1) WRAP 유틸리티
데이터베이스 조작 언어 중에 하나인 PL-SQL은 SQL언어가 가지지 못한 많은 장점들을 가지고 있습니다.
그럼에도 불구하고 가장 큰 단점은 소스 프로그램의 비효율적 관리 방법과 디스크에 남아 있는 소스 내용의 노출로 인해 보안에 지대한 문제점을 가지고 있다는 점입니다.
이와 같은 문제점을 보완하기 위해 오라클 사에서는 운영체계 상에서 작성된 PL-SQL의 소스 프로그램의 노출 방지를 위해 WRAP 유틸리티를 제공합니다.
먼저, 테스트할 프로시저를 생성하기 위한 스크립트를 작성하십시오.

### html
[C:\] EDIT  wrap_test.sql
 CREATE PROCEDURE wraptest
IS  TYPE emp_tab IS TABLE OF employees%ROWTYPE  INDEX BY PLS_INTEGER;
all_emps emp_tab;
BEGIN
        SELECT * BULK COLLECT INTO all_emps FROM employees;
        FOR i IN 1..10 LOOP
           DBMS_OUTPUT.PUT_LINE('Emp Id: ' || all_emps(i).employee_id); END
LOOP;
END;
 /
C:\> WRAP iname=wrap_test.sql  oname=wrap_test.plb

Input file에는 방금 생성한 스토어드 프로시저의 이름을 정의하시고 Output file에는 암호화하고자 하는 파일 이름을 정의해 주시면 됩니다.

다음은 HR 사용자 계정으로 접속하여 암호화된 파일을 이용하여 프로시저를 생성하고 실행하십시오.

### html
C:\> SQLPLUS  HR/HR
SQL> @wrap_test.plb 암호화된 파일을 실행하면 프로시저가 생성됩니다.
프로시저가 생성되었습니다.
SQL> SET SERVEROUTPUT ON
SQL> CALL WRAPTEST();생성된 프로시저를 실행합니다.
Emp Id: 198
……………..
Emp Id: 100 출력된 결과 호출이 완료되었습니다.

2) DBMS_DDL 패키지
앞서 소개 드린 WRAP 유틸리티는 디스크에 저장되어 있는 PL-SQL의 소소 프로그램을 암호화할 수 있다면 DBMS_DDL.CREATE_WRAPPED는 데이터베이스 내에서 생성되는 PL-SQL의 소스 프로그램을 암호화시킬 수 있는 방법입니다.

### html

SQL> CONNECT  SYSTEM/MANAGER
SQL> DECLARE
package_text VARCHAR2(32767);
FUNCTION generate_spec (pkgname VARCHAR2)
RETURN VARCHAR2 AS
BEGIN
        RETURN
'CREATE PACKAGE ' || pkgname || '
AS PROCEDURE raise_salary (emp_id NUMBER, amount
NUMBER); PROCEDURE fire_employee (emp_id NUMBER); END ' || pkgname || ';';
END generate_spec;
BEGIN  package_text := generate_spec('emp_actions');    
SYS.DBMS_DDL.CREATE_WRAPPED(package_text);
END;

? EMP_ACTIONS 패키지를 생성하면서 소스 프로그램을 DBMS_DDL.CREATE_WRAPPED로 암호화하는 방법입니다.

### html
(SQL) SELECT text FROM USER_SOURCE WHERE name = 'EMP_ACTIONS';
TEXT
---------------------------------------------------------------
PACKAGE emp_actions wrapped
a000000
1f


3) DBMS_CRYPTO 패키지
최근 사회적 이슈가 되고 있는 내용 중에 개인 정보의 유출로 인해 심각한 사회 문제가 되고 있는 것이 현실입니다.
이러한 문제를 해소하기 위해 오라클 사에서는 컬럼 단위와 블록 단위의 암호화 기능을 제공하고 있습니다.
다음 예제는 DBMS_CRYPTO 패키지를 이용하여 컬럼 단위의 암호화를 적용하는 예제입니다.

### html
SQL> CONNECT  /as sysdba           
SQL> DECLARE
       input_string VARCHAR2 (200) := 'Secret Message';
       output_string VARCHAR2 (200);
       encrypted_raw RAW (2000);           -- stores encrypted binary text
       decrypted_raw RAW (2000);           -- stores decrypted binary text
       num_key_bytes NUMBER := 256/8;      -- key length 256 bits (32 bytes)
       key_bytes_raw RAW (32);             -- stores 256-bit encryption key
       encryption_type PLS_INTEGER :=      -- total encryption type
DBMS_CRYPTO.ENCRYPT_AES256+DBMS_CRYPTO.CHAIN_CBC+DBMS_CRYPTO
.PAD_PKCS5;
BEGIN
      DBMS_OUTPUT.PUT_LINE ( 'Original string: ' || input_string);
      key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
      encrypted_raw := DBMS_CRYPTO.ENCRYPT (
            src => UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8'),
                      typ => encryption_type, key => key_bytes_raw );
      decrypted_raw := DBMS_CRYPTO.DECRYPT (
 src => encrypted_raw, typ => encryption_type,
                       key => key_bytes_raw );
      output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
      DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || output_string);
END;
/

+ Recent posts