DB때문에 하루종일 질문만 하네요. ^^;

cjy1126의 이미지

saddr_c를 char과 VARCHAR 둘다 실행한 결과 값이 안나옵니다.

VACHAR로하고 saddr_c.arr 까지 모든 방법을 써봤습니다.

sqlplus에서는 제대로 4개의 값이 출력이됩니다.

연결은 제대로 된것같은데, insert까지 안되는걸로 봐서는... table과 연결이 안된것 같습니다.

처음 접속때 암호를 다르게 넣으면 잘못된 암호라고 나오거든요.

이 프로그램의 문제점과 proc로 짠 프로그램을 디버깅하는 방법을 알고싶습니다.

너무 질문만 올리는것 같아서 그런데, proc관련 좋은(쉬운 ^^) 사이트나 문서 도 부탁드립니다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

EXEC SQL BEGIN DECLARE SECTION;
VARCHAR connect[20];
char saddr_c[16];
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE SQLCA;

#define CONNECT "mini/mini"

void get_data();

main()
{
         strcpy(connect.arr, CONNECT);
         connect.len = strlen(connect.arr);

         EXEC SQL CONNECT :connect;

         if(sqlca.sqlcode < 0)
         {
                 printf("\n%s", sqlca.sqlerrm.sqlerrmc);
                 EXEC SQL ROLLBACK WORK RELEASE;
                 exit(1);
         }

         else
         {
                 printf("\nConnect to Oracle.\n");
                 EXEC SQL COMMIT WORK RELEASE;
                 get_data();
         }
         exit(0);
}

void get_data()
{
         int i;
         printf("this is get_data()\n");

         EXEC SQL SELECT SADDR INTO :saddr_c FROM CLIENT;

         printf("################################\n");
         printf("%s\n", saddr_c);

         exit(0);
}
송현섭의 이미지

EXEC SQL ROLLBACK WORK RELEASE;
이것은 지금까지의 작업을 Roollback한다는 뜻입니다.

EXEC SQL COMMIT WORK RELEASE;
이것은 지금까지의 작업을 Commit한다는 뜻입니다.

기본적으로 Oracle은 트랜잭션 즉시 Commit되진 않습니다. 이상황에서 접속이 종료되면, 작업한 내용이 날라가 버립니다.

그러므로 Insert가 안된 이유는 작업한 다음에
EXEC SQL COMMIT WORK RELEASE;
을 하지 않았기 때문입니다.

Select가 안된 이유는 스키마를 모르므로 뭐라 단정할 수 없겠네요. SADDR의 타입이 VARCHAR형이라면 char형으로 하시면 안됩니다. SADDR의 타입대로 하셔야 합니다. VARCHAR형의 경우 c로 변환될 때, 구조체로 변하거든요. 데이터 arr과 len으로 이루어진. 그러므로 상호변환하는 매크로나 함수를 만드셔서 사용하시는 것이 좋습니다.

printf("%s\n", saddr_c.arr);

이런 방식으로 찍는 것은 좀 위험합니다. VARCHAR형의 arr은 NULL로 끝난다는 보장이 없습니다. 그러므로 len값만큼 char형 버퍼에 복사한후, 그 다음에 NULL을 붙이셔서 사용하셔야 합니다.

저의 경우 디버깅은 주로,

sqlca.sqlcode가 0이 아니라면
printf("\n%s", sqlca.sqlerrm.sqlerrmc);
을 하도록 매크로를 만들어서 쿼리문 다음에 집어넣어서 했습니다.

Proc 자료는 오라클 책을 보시는 것이 가장 나을 듯 하네요..Oracle 홈페이지에서 Proc 매뉴얼을 다운로드 받을 수 있지만, 영어라서 좀 힘드실듯 ^^;;

sunyzero의 이미지

cjy1126 wrote:
saddr_c를 char과 VARCHAR 둘다 실행한 결과 값이 안나옵니다.

#include <stdio.h>
                 EXEC SQL ROLLBACK WORK RELEASE;
                 EXEC SQL COMMIT WORK RELEASE;

}

WORK RELEASE는 세션을 닫게 됩니다. 따라서 그냥 롤백이나 커밋만 하실려면 EXEC SQL ROLLBACK, 혹은 EXEC SQL COMMIT까지만 실행하시면 됩니다.

WORK RELEASE까지 하시면 접속이 끊어지므로 해당 세션은 더이상 존재하지 않습니다. 오라클 pro*c는 책을 보시면서 sample을 보시면서 공부하시라고 말씀 드리고 싶습니다.

========================================
* The truth will set you free.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.