Cách kiểm tra kiểu dữ liệu của cột trong SQL ✅ 2023
Thủ Thuật Hướng dẫn Cách kiểm tra kiểu tài liệu của cột trong SQL Mới Nhất
Lê Hữu Kông đang tìm kiếm từ khóa Cách kiểm tra kiểu tài liệu của cột trong SQL được Cập Nhật vào lúc : 2022-12-24 19:30:16 . Với phương châm chia sẻ Mẹo Hướng dẫn trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi đọc Post vẫn ko hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Tác giả lý giải và hướng dẫn lại nha.SQLColumns() trả về list những cột trong những bảng đã chỉ định. tin tức được trả về trong tập kết quả SQL, hoàn toàn có thể được truy xuất bằng phương pháp sử dụng cùng những hàm tìm nạp tập kết quả mà một truy vấn tạo ra
Nội dung chính Show- Thông số kỹ thuật ODBC cho SQLColumns()đối số chức năngCách sử dụngTrả lại mãchẩn đoánLàm cách nào để kiểm tra kiểu tài liệu của cột trong Oracle SQL?Các loại cột trong SQL là gì?
Thông số kỹ thuật ODBC cho SQLColumns()
Bảng 1. Thông số kỹ thuật của SQLColumns() Mức thông số kỹ thuật ODBC Trong thông số kỹ thuật X/Open CLI CAE?Trong thông số kỹ thuật ISO CLI?1. 0CóKhông
cú pháp
SQLRETURN SQLColumns (SQLHSTMT hstmt, SQLCHAR FAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR FAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR FAR *szTableName, SQLSMALLINT cbTableName, SQLCHAR FAR *szColumnName, SQLSMALLINT cbColumnName);đối số hiệu suất cao
Bảng sau liệt kê kiểu tài liệu, cách sử dụng và mô tả cho từng đối số trong hàm này
Bảng 2. SQLColumns() đối số Kiểu dữ liệuArgumentUseDescriptionSQLHSTMT hstmt inputXác định xử lý câu lệnh. SQLCHAR * szCatalogName inputIxác định bộ đệm hoàn toàn có thể chứa giá trị mẫu để . Danh mục là phần đầu tiên của tên bảng gồm ba phần.
Đây phải là một con trỏ null hoặc một chuỗi có độ dài bằng không
SQLSMALLINT cbCatalogName inputXác định độ dài, tính bằng byte, của szCatalogName. This must be set to 0.SQLCHAR *szSchemaName inputIxác định bộ đệm hoàn toàn có thể chứa giá trị mẫu để . SQLSMALLINT cbSchemaName inputChỉ định độ dài, tính bằng byte, của szSchemaName . SQLCHAR * szTableName inputIxác định vùng đệm hoàn toàn có thể chứa giá trị mẫu để đủ điều kiện đặt kết quả theo tên bảng. SQLSMALLINT cbTableName inputChỉ định độ dài, tính bằng byte, của szTableName . SQLCHAR * szColumnName inputIxác định vùng đệm hoàn toàn có thể chứa giá trị mẫu để đủ điều kiện đặt kết quả theo tên cột. SQLSMALLINT cb Tên cột inputChỉ định độ dài, tính bằng byte, của Column_Name .Cách sử dụng
Hàm này lấy thông tin về những cột của một bảng hoặc một tập hợp những bảng. Thông thường, bạn gọi hàm này sau khi bạn gọi
/* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */ 0 để xác định những cột của bảng. Sử dụng những chuỗi ký tự được trả về trong những cột TABLE_SCHEM và TABLE_NAME của tập kết quả /* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */ 0 làm đầu vào cho hàm nàySQLColumns() trả về một tập hợp kết quả tiêu chuẩn, được sắp xếp theo TABLE_CAT, TABLE_SCHEM, TABLE_NAME và ORDINAL_POSITION. Bảng 3 liệt kê những cột trong tập kết quả
Các đối số szSchemaName, szTableName và szColumnName đồng ý .
Bởi vì những cuộc gọi tới SQLColumns() thường dẫn đến một truy vấn khuôn khổ phức tạp và tốn kém, hãy sử dụng những cuộc gọi này một cách tiết kiệm và lưu kết quả thay vì lặp lại những cuộc gọi
Các cột VARCHAR của tập kết quả hàm khuôn khổ được khai báo với thuộc tính độ dài tối đa là 128 byte (phù phù phù hợp với tiêu chuẩn ANSI/ISO SQL năm 1992 limits). Because Db2 ít hơn 128 ký tự nên ứng dụng hoàn toàn có thể chọn luôn dành 128 ký tự (cộng với dấu kết thúc nul) cho bộ đệm đầu ra. Ngoài ra, bạn hoàn toàn có thể gọi
/* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */ 0 với đối số InfoType được đặt thành từng giá trị sau.- SQL_MAX_CATALOG_NAME_LEN, để xác định độ dài của những cột TABLE_CAT mà khối mạng lưới hệ thống quản lý cơ sở tài liệu được link hỗ trợSQL_MAX_SCHEMA_NAME_LEN, để xác định độ dài của những cột TABLE_SCHEM mà khối mạng lưới hệ thống quản lý cơ sở tài liệu được link hỗ trợSQL_MAX_TABLE_NAME_LEN, để xác định độ dài của những cột TABLE_NAME mà khối mạng lưới hệ thống quản lý cơ sở tài liệu được link hỗ trợSQL_MAX_COLUMN_NAME_LEN, để xác định độ dài của cột COLUMN_NAME mà khối mạng lưới hệ thống quản lý cơ sở tài liệu được link tương hỗ
Mặc dù những cột mới hoàn toàn có thể được thêm vào và tên của những cột hiện có hoàn toàn có thể thay đổi trong những bản phát hành sau này, nhưng vị trí của những cột hiện tại sẽ không thay đổi. Bảng sau đây liệt kê những cột trong tập hợp kết quả mà SQLColumns() hiện giờ đang trả về
Bảng 3. Các cột được trả về bởi SQLColumns() Số cộtTên cộtKiểu dữ liệuMô tả1TABLE_CATVARCHAR(128)Luôn rỗng. 2TABLE_SCHEMVARCHAR(128)Xác định tên của giản đồ chứa TABLE_NAME. 3TABLE_NAMEVARCHAR(128) NOT NULLIxác định tên của bảng, dạng xem, bí danh hoặc từ đồng nghĩa. 4COLUMN_NAMEVARCHAR(128) NOT NULLXác định cột được mô tả. Cột này chứa tên cột của bảng, dạng xem, bí danh hoặc từ đồng nghĩa đã chỉ định. 5DATA_TYPESMALLINT NOT NULLXác định kiểu tài liệu SQL của cột mà COLUMN_NAME chỉ ra. 6TYPE_NAMEVARCHAR(128) NOT NULLIxác định chuỗi ký tự đại diện cho tên của loại tài liệu tương ứng với cột tập hợp kết quả DATA_TYPE. 7COLUMN_SIZEINTEGERNếu giá trị cột DATA_TYPE biểu thị một ký tự hoặc chuỗi nhị phân, thì cột này chứa độ dài ký tự tối đa cho cột.
Đối với nhiều chủng loại tài liệu ngày, giờ, dấu thời gian, đây là tổng số ký tự được yêu cầu để hiển thị giá trị khi nó được quy đổi thành ký tự
Đối với nhiều chủng loại tài liệu số, đây là tổng số chữ số hoặc tổng số bit được phép trong cột, tùy thuộc vào giá trị trong cột NUM_PREC_RADIX trong tập hợp kết quả
Đối với kiểu tài liệu XML, độ dài bằng 0 được trả về
8BUFFER_LENGTHINTEGERCho biết số byte tối đa cho bộ đệm C được link để tàng trữ tài liệu từ cột này nếu SQL_C_DEFAULT được chỉ định trên những lệnh gọi /* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */ 3, /* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */ 4 và /* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */ 5. Độ dài này sẽ không gồm có bất kỳ bộ kết thúc nul nào. Đối với nhiều chủng loại tài liệu số đúng chuẩn, độ dài chiếm phần thập phân và dấu. 9DECIMAL_DIGITSSMALLINT cho biết thêm thêm tỷ lệ của cột. NULL được trả về cho những loại tài liệu không áp dụng tỷ lệ. 10NUM_PREC_RADIXSMALLINTSchỉ định 10, 2 hoặc NULLNếu DATA_TYPE là một loại tài liệu số gần đúng, thì cột này chứa giá trị 2 và cột COLUMN_SIZE chứa số bit được phép trong cột
Nếu DATA_TYPE là loại tài liệu số đúng chuẩn, thì cột này chứa giá trị 10 và COLUMN_SIZE chứa số chữ số thập phân được phép cho cột
Đối với những kiểu tài liệu số, khối mạng lưới hệ thống quản lý cơ sở tài liệu hoàn toàn có thể trả về giá trị NUM_PREC_RADIX là 10 hoặc 2
NULL được trả về cho những loại tài liệu không áp dụng cột NUM_PREC_RADIX
11NULLABLESMALLINT NOT NULLChứa SQL_NO_NULLS nếu cột khước từ giá trị nullChứa SQL_NULLABLE nếu cột đồng ý giá trị null
12REMARKSVARCHAR(762)Chứa bất kỳ thông tin mô tả nào về cột. 13COLUMN_DEFVARCHAR(254)Xác định giá trị mặc định cho cộtNếu giá trị mặc định là một chữ số, thì cột này chứa màn biểu diễn ký tự của chữ số không còn dấu nháy đơn kèm theo
Nếu giá trị mặc định là một chuỗi ký tự, thì cột này là chuỗi đó, được đặt trong dấu nháy đơn
Nếu giá trị mặc định là giả chữ , ví dụ như đối với những cột NGÀY, GIỜ và DẤU THỜI GIAN, thì cột này chứa từ khóa của .
Nếu NULL được chỉ định làm giá trị mặc định, cột này sẽ trả về từ NULL, không còn dấu nháy đơn kèm theo
Nếu giá trị mặc định không thể được biểu thị mà không biến thành cắt bớt, thì cột này chứa giá trị ĐƯỢC CẮT TRUNCATED không còn dấu nháy đơn kèm theo
Nếu không còn mức giá trị mặc định nào được chỉ định, cột này là null
14SQL_DATA_TYPESMALLINT NOT NULLCho biết kiểu tài liệu SQL. Cột này giống với cột DATA_TYPEĐối với nhiều chủng loại tài liệu ngày giờ, trường SQL_DATA_TYPE trong tập hợp kết quả là SQL_DATETIME và trường SQL_DATETIME_SUB trả về mã con cho loại tài liệu ngày giờ rõ ràng (SQL_CODE_DATE, SQL_CODE_TIME hoặc SQL_CODE_TIMESTAMP)
15SQL_DATETIME_SUBSMALLINT Mã kiểu con cho kiểu tài liệu ngày giờ hoàn toàn có thể là một trong những giá trị sau- SQL_CODE_DATESQL_CODE_TIMESQL_CODE_TIMESTAMP
Chứa độ dài tối đa tính bằng byte cho một cột tài liệu ký tự. Đối với những bộ ký tự một byte, giá trị này in như COLUMN_SIZE. Đối với loại XML, số 0 được trả về. Đối với nhiều chủng loại tài liệu không phải là kiểu tài liệu ký tự hoặc kiểu tài liệu XML, nó là null
17ORDINAL_POSITIONINTEGER NOT NULLVị trí thứ tự của cột trong bảng. Cột đầu tiên trong bảng là số 1. 18IS_NULLABLEVARCHAR(254)Chứa chuỗi 'KHÔNG' nếu cột được biết là không thể rỗng;Tập hợp kết quả mà bảng trước mô tả giống hệt với đặc tả tập hợp kết quả X/Open CLI Columns(), là phiên bản mở rộng của tập hợp kết quả SQLColumns() mà ODBC 2. 0 chỉ định. Tập hợp kết quả ODBC SQLColumns() gồm có mọi cột ở cùng một vị trí cho tới cột NHẬN XÉT
Db2 Các ứng dụng ODBC phát hành SQLColumns() đối với sever Db2 cho z/OS® sẽ mong đợi .
Trả lại mã
Sau khi bạn gọi SQLColumns(), nó sẽ trả về một trong những giá trị sau
- SQL_SUCCESSSQL_SUCCESS_WITH_INFOSQL_ERRORSQL_INVALID_HANDLE
chẩn đoán
Bảng sau đây liệt kê từng SQLSTATE mà hàm này tạo ra, với mô tả và lý giải cho từng giá trị
Bảng 4. SQLColumns() SQLSTATE SQLSTATEMô tảGiải thích08S01 Lỗi link tiếp xúc. Liên kết tiếp xúc giữa ứng dụng và nguồn tài liệu không thành công trước khi hiệu suất cao hoàn tất. 24000 Trạng thái con trỏ không hợp lệ. Con trỏ đang mở trên bộ điều khiển câu lệnh. HY001 Lỗi cấp phép bộ nhớ. Db2 ODBC không thể phân bổ bộ nhớ thiết yếu để tương hỗ thực thi hoặc hoàn thành xong hiệu suất cao. HY010 Lỗi chuỗi hàm.
Hàm được gọi trong quá trình thực thi tài liệu. (Nghĩa là, hàm được gọi trong một thủ tục sử dụng những hàm SQLColumns()1 hoặc SQLColumns()2. )
HY014 Không còn tay cầm nào nữa. Db2 ODBC không thể phân bổ xử nguyên do tài nguyên nội bộ thấp. HY090 Độ dài bộ đệm hoặc chuỗi không hợp lệ. Giá trị của một trong những đối số độ dài tên nhỏ hơn 0 và không bằng SQL_NTS. HYC00 Trình điều khiển không hoạt động và sinh hoạt giải trí. Db2 ODBC không tương hỗ "khuôn khổ" làm từ hạn định cho tên bảng.Ví dụ
Ví dụ sau đây đã cho tất cả chúng ta biết một ứng dụng truy vấn khuôn khổ khối mạng lưới hệ thống để biết thông tin về những cột trong bảng. Hình 1. Một ứng dụng trả về thông tin về những cột của bảng
/* .. */ SQLRETURN list_columns(SQLHDBC hdbc, SQLCHAR *schema, SQLCHAR *tablename ) { /* .. */ rc = SQLColumns(hstmt, NULL, 0, schema, SQL_NTS, tablename, SQL_NTS, "NTS); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) column_name.s, 129, &column_name.ind); rc = SQLBindCol(hstmt, 6, SQL_C_CHAR, (SQLPOINTER) type_name.s, 129, &type_name.ind); rc = SQLBindCol(hstmt, 7, SQL_C_LONG, (SQLPOINTER) &length, sizeof(length), &length_ind); rc = SQLBindCol(hstmt, 9, SQL_C_SHORT, (SQLPOINTER) &scale, sizeof(scale), &scale_ind); rc = SQLBindCol(hstmt, 12, SQL_C_CHAR, (SQLPOINTER) remarks.s, 129, &remarks.ind); rc = SQLBindCol(hstmt, 11, SQL_C_SHORT, (SQLPOINTER) & nullable, sizeof(nullable), &nullable_ind); printf("Schema: /* Fetch each row, and display */ while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) printf(" name.s); if (nullable == SQL_NULLABLE) printf(", NULLABLE"); else printf(", NOT NULLABLE"); printf(", name.s); if (length_ind != SQL_NULL_DATA) printf(" ( else printf("(n"); if (scale_ind != SQL_NULL_DATA) printf(", else printf(")n"); /* endwhile */ /* .. */