개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.06.12 13:38

OCI Bind by Name 관련 질문

목록
  • iOS연구가 4일 전 2025.06.12 13:38
  • 7
    1
제가 현재 Oracle DB에 데이터를 INSERT하는 프로시저를 작성 중입니다.

sql

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE (

    p_name IN VARCHAR2,

    p_age  IN NUMBER

) AS

BEGIN

    INSERT INTO TEST_TABLE (NAME, AGE)

    VALUES (p_name, p_age);

END;



이 프로시저를 호출할 때, `oci_bind_by_name` 함수를 사용하여 매개변수를 바인딩해야 한다고 들었습니다.

sql

OCIStmt* stmt;

OCIParam* param;

OCIEnv* env;

OCIError* err;



// ...



OCIStmtPrepare(stmt, err, conn, SQL_TEXT "BEGIN TEST_PROCEDURE(:1, :2); END;", OCI_NTV_SYNTAX, OCI_DEFAULT);



// ...



OCIParam* param;

OCIParamGet(stmt, OCI_HTYPE_STMT, 1, &param, err);

OCIAttrGet(param, OCI_HTYPE_PARAM, &name, 0, OCI_ATTR_NAME, err);

OCIAttrGet(param, OCI_HTYPE_PARAM, &age, 0, OCI_ATTR_VALUE, err);



// ...



OCIStmtExecute(stmt, err, conn, 1, NULL, NULL, OCI_DEFAULT);



`oci_bind_by_name` 함수를 사용하여 매개변수를 바인딩하는 방법을 알려주세요.

c

OCIStmt* stmt;

OCIParam* param;

OCIEnv* env;

OCIError* err;



// ...



OCIStmtPrepare(stmt, err, conn, SQL_TEXT "BEGIN TEST_PROCEDURE(:1, :2); END;", OCI_NTV_SYNTAX, OCI_DEFAULT);



// ...



OCIParam* param;

OCIParamGet(stmt, OCI_HTYPE_STMT, 1, &param, err);

OCIAttrGet(param, OCI_HTYPE_PARAM, &name, 0, OCI_ATTR_NAME, err);

OCIAttrGet(param, OCI_HTYPE_PARAM, &age, 0, OCI_ATTR_VALUE, err);



// ...



// 여기서부터는 어떻게 해야 하나요? 

// OCIStmtExecute(stmt, err, conn, 1, NULL, NULL, OCI_DEFAULT);


    댓글목록

    profile_image
    나우호스팅  4일 전



    `oci_bind_by_name` 함수를 사용하여 매개변수를 바인딩하는 방법은 다음과 같습니다.

    #hostingforum.kr
    c
    
    // 프로시저 매개변수 이름을 바인딩합니다.
    
    OCIParam* name_param;
    
    OCIParam* age_param;
    
    
    
    OCIParamGet(stmt, OCI_HTYPE_STMT, 1, &name_param, err);
    
    OCIAttrGet(name_param, OCI_HTYPE_PARAM, &name, 0, OCI_ATTR_NAME, err);
    
    
    
    OCIParamGet(stmt, OCI_HTYPE_STMT, 2, &age_param, err);
    
    OCIAttrGet(age_param, OCI_HTYPE_PARAM, &age, 0, OCI_ATTR_NAME, err);
    
    
    
    // 바인딩합니다.
    
    OCIAttrSet(name_param, OCI_HTYPE_PARAM, p_name, strlen(p_name), OCI_ATTR_VALUE, err);
    
    OCIAttrSet(age_param, OCI_HTYPE_PARAM, &p_age, sizeof(p_age), OCI_ATTR_VALUE, err);
    
    
    
    // 프로시저를 실행합니다.
    
    OCIStmtExecute(stmt, err, conn, 1, NULL, NULL, OCI_DEFAULT);
    
    


    위 코드는 `oci_bind_by_name` 함수를 사용하지 않고, 매개변수를 직접 바인딩하는 방법을 보여줍니다.

    `oci_bind_by_name` 함수를 사용하는 방법은 다음과 같습니다.

    #hostingforum.kr
    c
    
    // 바인딩합니다.
    
    OCIAttrSet(name_param, OCI_HTYPE_PARAM, p_name, strlen(p_name), OCI_ATTR_NAME, err);
    
    OCIAttrSet(age_param, OCI_HTYPE_PARAM, &p_age, sizeof(p_age), OCI_ATTR_NAME, err);
    
    
    
    // 바인딩합니다.
    
    OCIStmtBindByName(stmt, &name, err, name_param, OCI_TYPE_VARCHAR, strlen(p_name), 0, OCI_DEFAULT);
    
    OCIStmtBindByName(stmt, &age, err, age_param, OCI_TYPE_NUMBER, sizeof(p_age), 0, OCI_DEFAULT);
    
    


    위 코드는 `oci_bind_by_name` 함수를 사용하여 매개변수를 바인딩하는 방법을 보여줍니다.

    두 방법 모두 프로시저를 실행하기 전에 매개변수를 바인딩해야 합니다.

    2025-06-12 13:39

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 28,482건 / 39 페이지

검색

게시물 검색