Database를 사용할 때 조회 결과를 이용하여 프로그램을 분기해야 하는 상황이 발생합니다.

count를 계산하는 경우라면 당연히 걱정할 필요가 없는데 꼭 필드의 값을 받아와야만 하는 경우에는 편법을 이용해야 하는데 제일 간단한 방법을 기록해 둡니다.

 

Oracle DB는 오라클에서 제공하는 online 서비스를 이용해서 설명합니다.

Oracle 온라인 서비스는 예전에 한번 소개했는데 간단한 사용법은 아래 주소에 가면 됩니다.

 

https://copycoding.tistory.com/272

 

 

Job Table을 검색해서 데이터를 확인해 봅니다.

 

JOB_ID가 없는 row를 그냥 count 하는 작업이면 간단하게 “0” 값을 얻을 수 있습니다.

 

 

 

그러나 그냥 개수가 아닌 필드의 값을 받아와서 그 값을 가지고 계산을 하거나 조건절을 사용하려는 경우에는 난감합니다.

 

 

값을 넘겨받지 못하여 프로그램에서 에러가 발생합니다.

 

이런 경우 0 또는 본인이 받고 싶은 다른 값을 받아오는 방법입니다.

간단히 RIGHT OUTER JOIN DUAL을 해주면 됩니다.

 

 

 

where 절은 ON으로 변경해주면 결과를 얻을 수 있습니다.

 

테스트에 사용된 전체 쿼리 입니다.

 

 
select
    "JOB_ID",
    "JOB_TITLE",
    "MIN_SALARY",
    "MAX_SALARY"
from HR."JOBS";
 
 
select
    count(*)
from HR."JOBS"
where 1 = 1
  and MIN_SALARY > 1000 
  and MAX_SALARY < 50000
  and JOB_ID = 'aaaa';
 
 
select
    MIN_SALARY
from HR."JOBS"
where 1 = 1
  and MIN_SALARY > 1000 
  and MAX_SALARY < 50000
  and JOB_ID = 'aaaa';
 
 
select
    NVL(MIN_SALARY, 0) as MIN_SALARY
from HR."JOBS" RIGHT OUTER JOIN DUAL
 ON 1 = 1
  and MIN_SALARY > 1000 
  and MAX_SALARY < 50000
  and JOB_ID = 'aaaa';
 

 - copy coding -

 

PostgreSQL 데이터베이스를 dump 명령등을 사용해서 파일로 저장하면 이전에 insert 해놓은 자료들을 찾아보기가 어렵습니다. 이런 경우는 DB의 이름을 변경해서 그대로 복사해 놓으면 자료를 찾아보기도 쉽고 작업하기도 편리 합니다.  

postgresqldatabase를 복사하기 위한 작업을 해보겠습니다.

 

먼저 알고 있는 명령어를 사용해서 작업을 시작해 봅니다.

 

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 TestDB    | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 postgres  | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0 | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

 

리스트에 나오는 TestDB를 다른 이름으로 복사하는 명령어는 아래와 같습니다.

 

CREATE DATABASE [new database] WITH TEMPLATE [old database] OWNER [owner];

 

TestDBTestDB2022라는 DB로 복사하려면

 

CREATE DATABASE TestDB2022 WITH TEMPLATE TestDB OWNER postgres;

 

이렇게 명령어를 입력하면 되겠네요.

 

 

postgres=# CREATE DATABASE TestDB2022 WITH TEMPLATE TestDB OWNER postgres;
오류:  "TestDB" 템플릿 데이터베이스 없음
postgres=#

 

그렇지만 대부분 오류가 발생하게 됩니다.

이유는 오류 내용과 같이 템플릿 데이터베이스가 아니기 때문 입니다.

 

postgres=# select datname, datistemplate from pg_database;
  datname  | datistemplate
-----------+---------------
 postgres  | f
 TestDB    | f
 template1 | t
 template0 | t
(4 rows)

 

TestDBdatistemplate 값이 f(false)입니다.

true로 변경을 합니다.

 

postgres=# ALTER DATABASE "TestDB" WITH IS_TEMPLATE = true;
ALTER DATABASE
postgres=#

 

이제 다시 TestDB를 복사해 봅니다.

 

postgres=# CREATE DATABASE "TestDB2022" WITH TEMPLATE "TestDB";
CREATE DATABASE
postgres=# \l
                                  List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
------------+----------+----------+-------------+-------------+-----------------------
 TestDB     | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 TestDB2022 | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 postgres   | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0  | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
 template1  | postgres | UTF8     | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
(5 rows)

 

 

복사가 잘 진행 되었습니다.

명령문에 CREATE DATABASE "TestDB2022" WITH TEMPLATE "TestDB";

쌍따옴표를 붙인 이유는 대소문자에 따라 Database 이름을 찾지 못하는 경우가 있습니다.

 

ALTER DATABASE "TestDB" WITH IS_TEMPLATE = false;

 

복사가 완료되면 기존 데이터베이스는 다시 templatefalse로 변경해 놓으면 작업은 완료 됩니다.

 

- copy coding -

 

linux에서 postgresql을 사용하기 위해 psql 명령어를 사용하는데 접속이 되지 않고 아래처럼 오류가 발생하였습니다.

 

[postgres@500115801534 postgresql]$ psql
psql: could not connect to server: 그런 파일이나 디렉터리가 없습니다
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

 

 

이런 오류는 postgres를 실행하지 않아서 발생한다고 되어 있는데 명령어로 확인해 보면

 

$ ps -ef | grep postgres

 

 

프로세스가 잘 실행되고 있습니다.

 

다음으로는 .s.PGSQL.5432 파일이 없어서 그렇다고 하는데 오류에 나와있는 폴더를 찾아가서 확인해 봅니다.

 

$ cd /var/run/postgresql/

$ ls -al

srwxrwxrwx.  1 postgres postgres   0  5 25 16:32 .s.PGSQL.5532

 

파일도 있습니다그렇지만 파일명이 좀 다른것을 확인할 수 있습니다.

 

저의 경우는 postgresqlport 번호를 변경해서 서비스를 하려고 하는 경우 이므로 위에서 시도한 방법으로는 해결이 될 수 없고 옵션을 사용해야 하는 경우 입니다.

 

$ psql -U postgres -p 5532

 

이렇게 psql을 실행할 때 옵션을 추가하면 데이터베이스에 접속이 가능 합니다.

 

여기서 비밀 번호를 요청하는데 postgres의 비밀번호를 입력하면 됩니다.

 

- copy coding -

 

쿼리를 이용하여 DB LINK를 만들기 위한 방법을 기록해 봅니다.
수정할 부분은 아래 두개의 쿼리에 붉은색 내용만 작업 하려는 시스템에 맞도록 수정하면 됩니다.

 

- 연결 서버 생성


EXEC sp_addlinkedserver  
       @server='REMOTEDB_DBLINK',  -- DB LINK할 서버의 별칭. 마음대로 기입.
       @srvproduct = '', -- 공백.
       @provider = 'SQLOLEDB', -- SQL 서버.
       @datasrc = '192.168.0.111', -- DB LINK할 서버의 IP.        
       @provstr='',   -- 공백.
       @catalog='REMOTEDB'   -- DB LINK할 DataBase 명칭.

 

- 연결 계정 생성


EXEC sp_addlinkedsrvlogin

      @rmtsrvname='REMOTEDB_DBLINK',  -- DB LINK할 서버의 별칭. 마음대로 기입.
      @useself= 'false',
      @rmtuser = 'userid', -- 연결할 DB의 계정
      @rmtpassword = 'password12@#' -- 연결할 DB의 계정 비밀번호

 

DB LINK가 완료 되면 링크된 디비를 조회해 봅니다.

 

REMOTEDB_DBLINK.REMOTEDB.dbo.TB_member;

 

대괄호로 묶기도 하는데 결과는 동일합니다.

 

SELECT * FROM [REMOTEDB_DBLINK].[REMOTEDB].[dbo].[TB_member];

 

검색 결과가 나왔다면 성공 입니다.

 

- copy coding -


12345···7

+ Recent posts