אביב תשס"הDBMS , PostgreSQL1 PostgreSQL עבודה עם שרת PostgreSQL : PSQL – מפענח שורת פקודה LIBPQ – ספריית C WebDB – ממשק מבוסס Web (לסטודנטים של הקורס) חשבונות: חשבון csl1 עליו יתבצע התרגיל הרטוב וגישה למפענח שורת פקודה חשבון במסד הנתונים לגישה דרך PSQL או WebDB פרטים נוספים ב-F.A.Q. באתר
אביב תשס"הDBMS , PostgreSQL2 PSQL – מפענח שורת פקודה גישה ל- client של PostgreSQL – מפענח שורת הפקודה: הגישה נעשת ע"י חיבור ssh ל-csl1 ומשם התחברות. התחברות : בהנחה ששם המשתמש שלכם הוא user יש להקיש: /usr/local/pgsql/bin/psql -h pgsql.cs.technion.ac.il user user (השימוש הראשון ב-user הוא עבור שם המסד נתונים שלכם. השימוש השני הוא עבור שם המשתמש) תופיעה בקשה לסיסמא (סיסמא ל-PostgreSQL) Password: xxxxxxxx עכשיו אתם בתוך מפענח שורת הפקודה של PostgreSQL user => יציאה: user => \q
אביב תשס"הDBMS , PostgreSQL3 PSQL – פקודות פנימיות פקודות פנימיות של המפענח: user=> \? – קבלת רשימה של הפקודות user=> \h select – select קבלת עזרה על פקודת user=> \q – יציאה מהמפענח user=> \d – קבלת רשימת טבלאות user=> \d person – person קבלת מידע על טבלת
אביב תשס"הDBMS , PostgreSQL4 PSQL – פקודות SQL הרצת פקודות SQL: user=> SELECT Year, COUNT(Book_Id) user=> FROM Books user=> GROUP BY Year user=> HAVING AVG(Pages) > 400; COUNT(Book_Id) Year user=> (3 rows)
אביב תשס"הDBMS , PostgreSQL5 LIBPQ – ספריית פונקציות C שימוש בפונקציות של LIBPQ בתוכנית C: #include הידור וקישור התוכנית: gcc -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq -o try try.c
אביב תשס"הDBMS , PostgreSQL6 שלד של תוכנית C המשתמשת ב- LIBPQ PGconn *conn; בתחילת התוכנית: i nt main(void) { /* Make a connection to the DB. If parameters omitted, default values are used */ conn = PQconnectdb(“host=pgsql.cs.technion.ac.il “ “dbname=user user=user password=pass”); /* check to see that the backend connection was successfully made */ if (!conn || PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr, "Connection to server failed: %s\n", PQerrorMessage(conn)); PQfinish(conn); return 1; } …
אביב תשס"הDBMS , PostgreSQL7 LIBPQ: שלד של תוכנית C – המשך בסיום התוכנית: … /* Close the connection to the database and cleanup */ PQfinish(conn); return 0; }
אביב תשס"הDBMS , PostgreSQL8 LIBPQ: ביצוע שאילתות/פקודות SQL ביצוע שאילתות/פקודות SQL: PQexec() PGresult *res; … res = PQexec(conn, “SELECT BOOK_NAME, ORDER_DATE “ “FROM ORDERED WHERE CUST_ID=123456”); if(!res || PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "Error executing query: %s\n", PQresultErrorMessage(res)); PQclear(res); return; } …
אביב תשס"הDBMS , PostgreSQL9 LIBPQ: PQexec() – המשך שימוש במחרוזת עזר: char cmd[200]; int cust_id; /* … */ cust_id = 20; /* could be result of some input or computation */ sprintf(cmd, “SELECT BOOK_NAME, ORDER_DATE “ “FROM ORDERED WHERE CUST_ID=%d”, cust_id); res = PQexec(conn, cmd); /* … */ שימו לב! יש לוודא שב-cmd יש מספיק מקום בשביל להכיל את הפקודות!
אביב תשס"הDBMS , PostgreSQL10 LIBPQ: בדיקת תוצאה של שאילתה ערך מוחזר מפונקציה PQresultStatus(): עבור שאילתה ("SELECT..."): PGRES_TUPLES_OK – השאילתה הצליחה אחרת – השאילתה נכשלה עבור פקודות אחרות (DML/DDL): PGRES_COMMAND_OK – הפקודה הצליחה אחרת – הפקודה נכשלה שימו לב : יצירת מבט היא פקודת DDL, ולא שאילתה !
אביב תשס"הDBMS , PostgreSQL11 LIBPQ: שליפת רשומות של תוצאה במידה והשאילתה הצליחה, נוכל לשלוף מידע מהתוצאה : int PQntuples(res) : מס ' הרשומות ( שורות ) בתוצאה ( יכול להיות 0) int PQnfields(res): מספר השדות ( עמודות ) בתוצאה char *PQfname(res, field_index): שם השדה לפי מספר ( החל מ -0) int PQfnumber(res, field_name): מספר השדה לפי שם char *PQgetvalue(res, tup_num, field_num): תוכן השדה המתאים בתוצאה int PQgetisnull(res, tup_num, field_num): NULL מחזיר 1 אם השדה הוא void PQclear(res): משחרר את המשאבים שהוקצו לתוצאה אם PQexec() לא הצליחה, נוכל לקבל תאור מילולי של השגיאה : char *PQresultErrorMessage(res)
אביב תשס"הDBMS , PostgreSQL12 LIBPQ: דוגמא דוגמא: בכל שנה יש להציג את מספר הספרים שיצאו לאור באותה שנה (ללא שימוש ב-GROUP BY) int books_by_year(PGconn *conn){ PGresult *res_year, *res_num; int i, year; char query[120]; res_year = PQExec(conn, “SELECT DISTINCT YEAR FROM BOOK”); if(!res_year || PQresultStatus(res_year) != PGRES_TUPLES_OK){ fprintf(stderr, "Error executing query: %s\n", PQresultErrorMessage(res_year)); PQclear(res_year); return -1; }
אביב תשס"הDBMS , PostgreSQL13 LIBPQ: דוגמא – המשך for(i=0;i<PQntuples(res_year);i++){ year = atoi(PQgetvalue(res_year,i,0)); sprintf(query, “SELECT COUNT(DISTINCT BOOK_NAME) “ “FROM BOOKS WHERE YEAR = %d”, year); res_num = PQexec(conn,query); if(!res_num || PQresultStatus(res_num) != PGRES_TUPLES_OK){ fprintf(stderr, "Error executing query: %s\n", PQresultErrorMessage(res_num)); PQclear(res_num); PQclear(res_year); return -1; } printf(“YEAR=%d Num.Books=%s\n”, year, PQgetvalue(res_num,0,0)); PQclear(res_num); } PQclear(res_year); return 0; }
אביב תשס"הDBMS , PostgreSQL14 WebDB: